- Published on
Swift 공부하면서 새롭게 알게된 내용 정리
- Authors
- Name
- 불꽃남자
sorted VS. sort
"자바스크립트 같은 스크립트 언어를 기존에 써왔던 사람이라면 Swift라는 언어는 비교적 쉽게 배울수있는 것 같다." 라고 생각했다가 뒤통수 맞는 것들이 몇가지 있는데 그중에 하나가 바로 sorted 함수와 sort 함수다. 둘의 차이는 정렬을 해서 반환값이 있냐? 없냐의 차이!
mutating func sort(isOrderedBefore: (T, T) -> Bool)
func sorted(isOrderedBefore: (T, T) -> Bool) -> [T]
함수 시그니처만 봐도 sort는 반환값이 없다.--;;
** 참고, Javascript 에서 sorted 함수는 당연히 없고, sort 함수는 본래 배열을 정렬시키고 정렬된 값을 slice해서 새로운 값으로 반환한다. 즉, Swift의 sort 와 sorted 두가지 역할을 모두 수행한다.
극강의 타입 추론 능력!
Swift 의 또 다른 매력이라고 하면 타입 추론을 빼놓을수없다. 얼마나 똑똑한 언어인지 개발자의 귀차니즘을 많이 줄여준다(?) 하지만 단점은 이게 뭔소린가하는 느낌을 줄정도다. 하지만 타입 추론 방식을 좀 이해하고 나니 지금은 꾀나 익숙해졌다.
var arr = [6,2,1,2,3,3]
arr.sort( Bool in
t1 Bool in
return t1 Bool in
return t1 Bool in
return t1 Bool)'
마지막으로 저 뜬금없는 sort 다음에 {} 중괄호!! 너는 도대체 뭐냐? 아래 6번 코드를 보자!
var arr = [6,2,1,2,3,3] arr.sort() { --- 6번 (t1:Int, t2:Int) -> Bool in return t1 X
// 이렇게 맨 마지막 인자가 함수면 끄집어 낼수있다. x.method(p1, p2, f1) ---> x.method(p1, p2) {}
## 제네릭 타입의 형변환
클로저 함수를 다루다 보면 타입 추론에 의해서 생략되는 녀석들이 많아 가끔씩 헷갈릴때가 있는데 이럴때는 꼭 해당 함수에 마우스를 올리고 커맨드 키와 함께 문서를 열어보는 것이 좋다. 여튼 Swift에서 제공하는 많은 내장 함수들이 Typealias나 제네릭 같은 타입을 많이 쓰고 있어서 클로저 함수에 인자를 받아서 쓰다보면 다음과 같은 에러가 종종 발생한다.
**
(!) Cannot invoke 'predicate' with an argument list of type '(T)'
extension Array { func myFilter(predicate:(T) -> Bool) -> [T] { var result = T
for i in self { if predicate(i) { // (predicate:(T) -> Bool) -> [T] { var result = T
for i in self { if predicate(i as! T) { //