티스토리 뷰
오늘은 정렬 함수인 sorted(by:) 를 공부해보다가 생긴 궁금증을 소개해볼게여
먼저, 간단하게 큰 숫자대로 정렬을 해볼까요?
오.. 그런데 이런 코드도 있던데요..?
let reversedNumber = [1,4,5,2,9].sorted(by: >)
// reversedNumber 는 [9, 5, 4, 2, 1] Int 형 배열을 가집니다.
let reversedNumber = [1,4,5,2,9].sorted(by: { $0 > $1 })
// .....?
잠시만 이게 무슨 일이죠? 그러면 by 라는 argument 의 자료형은 > 와 같은 연사자인가요..? 연산자라는 자료형이.. 있나요..? 아니면 클로저..? 어질어질하네요 😵💫
일단 sorted(by:) 함수에 대해서 알아봅시다.
func sorted(by areInIncreasingOrder: (Element, Element) throws -> Bool) rethrows -> [Element]
네..! 지금은 모르는 것들이 많을 수 있겠지만 by 라는 argument 는 클로저를 가집니다.
어쨋든~~ 오늘 알아볼건 왜 저런 형태의 코드가 나오는가에요
우리는 클로저의 많은 형태에 대해서 접합니다..🥲
{ (a: Int, b: Int) -> Int in
return a + b
}
// 이런 형태도
{ (a: Int, b: Int) in
return a + b
}
// 이런 형태도..
{ a, b in
return a + b
}
// 이런 형태도...
{ a, b in
a + b
}
//이런 형태도...?
{ return $0 + $1 }
// 이런 형태도...
{ $0 + $1 }
우아... 무엇이 어떻게 되서 변하는 것인지...
저도... 편안하게 쓰고싶은데...
이번 기회에 Swift 문서를 보면서 클로저의 표현 방법에 대해서 알아보도록 합시다!😎
알고리즘이 아닌 프로그래밍을 할 때도 많은 도움이 되면 좋겠네여!
😎 Closure expression syntax
클로저의 기본적인 표현 방법.
{ ( parameters ) -> return type in
statements
}
예시를 들어가면서 진행하겠습니다
let names = ["Chris", "Alex", "Ewa", "Barry", "Daniella"]
func backward(_ s1: String, _ s2: String) -> Bool {
return s1 > s2
}
var reversedNames = names.sorted(by: backward)
// reversedNames is equal to ["Ewa", "Daniella", "Chris", "Barry", "Alex"]
위의 코드를 클로저 표현식 구문으로 나타내 보면
let reversedNames = names.sorted(by: { (s1: String, s2: String) -> Bool in
return s1 > s2
})
함수를 아예 (by:) 속에 집어넣었죠? 실행문은 in 뒤에 써주었습니다.
😎 Inferring Type from context
sorted(by: ) 메서드에서 매개변수로 함수 타입을 받기 때문에 결과적으로 함수 타입과 반환할 타입을 유추할 수 있습니다.
let reversedNames = names.sorted(by: { s1, s2 in return s1 > s2 } )
😎 Implicit returns form Single-Expression closure
단일 표현식에서는 return 키워드도 생략가능하니다. return 이 사라졌죠
let reversedNames = names.sorted(by: { s1, s2 in s1 > s2 } )
😎 Shortand argument names
Swift 는 인라인 클로저(삽입된 클로저라고 보면되요)에서 인수 이름을 간단하게 사용하는 방법을 제공합니다. 이때 in 키워드도 생략할 수 있어요.
$0 는 s1 을 s1 은 s2 를 암시적으로 의미해요. s1 과 s2 역시 클로저안에서 매개변수를 받기위해 지정한 변수명이기 때문에 $0, $1 로 설정하면 변수명을 고민하는 부담은 덜 수 있겠네요!
let reversedNames = names.sorted(by: { $0 > $1 } )
😎 Operator methods
비교 연산자(<, >) 를 사용해서 비교할 수 있어요.
드디어 우리가 흔히 봐왔던 sorted(by: >) 형태가 되는 것이죠...!
let reversedNames = names.sorted(by: >)
// 내림차순으로 정렬된 배열을 반환하게 된다.
$0, $1 이게 진짜 어디서 오는건지 궁금했는데 어느정도 궁금증이 풀렸다면..! 오케이입니다!
혹시나 잘 모르겠더라도 눈에 담아두고 나중에 생각나면 찾아와주세여~
출처
'iOS' 카테고리의 다른 글
iOS) 여러개의 view controller pop 하기 (2) | 2021.10.20 |
---|---|
iOS) Type Casting(타입캐스팅) (0) | 2021.10.13 |
iOS) 다크 모드 대응하기 (0) | 2021.10.11 |
iOS) available 알아보기 (0) | 2021.10.11 |
iOS) UIModalTransitionStyle.partialCurl 알아보기 (0) | 2021.10.09 |
- WWDC
- YPImagePicker
- UserDefaults
- projectsetting
- 서버통신
- WidgetKit
- RxCocoa
- Swift
- configurable widget
- IOS
- 2022 KAKAO TECH INTERNSHIP
- Protocol
- OpenSourceLibrary
- MOYA
- Objective-C
- async/await
- rxswift
- MVVM
- APNS
- watchOS
- CloneCoding
- SwiftUI
- Firebase
- Algorithm
- WWDC22
- github
- Notification
- Widget
- containerBackground
- urlsession
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- Total
- Today
- Yesterday