본문 바로가기
Swift

[Swift] Swift의 $0구문은 어떻게 나온걸까?

by ykr0919 2023. 11. 6.

 

최근 코테 공부를 하다가 $0를 사용하게 되었다!! 도대체 $0 뭐지??? 어디서 나온 거지??? 같이 알아보자! 

 

selectArr = arr.filter { $0 != arr[i] && $0 != arr[j] }

 

 

무엇인지 찾아보니 🤔 '$0은 클로저에서 "첫 번째 인수"를 의미하는 지름길'이라고 한다. 그럼 여기서 클로저가 무엇일까? 아직 모르는 게 많아 계속 막 한다..... ㅠ

 

'클로저(Closure):일정 기능을 하는 코드를 하나의 블록으로 모아놓은 것' 이런 말로는 잘 이해가 가지 않는다...

 

클로저에는 NamedClosure과 UnnamedClosure이 존재한다. func을 키워드를 사용해서 이름을 붙여주는 함수가 NamedClosure 

 

func doSomething() {
    print("Somaker")
}

 

이름을 붙이지 않고 사용하는 함수를 익명함수, 즉 UnnamedClosure이라고 한다. 

 

let closure = { print("Somaker") }

 

보통 클로저는 UnnamedClosure를 말한다고 한다! 

 

 

클로저의 표현식은 

 

{(parameters) -> Return Type in 실행구문}

 

 

일단 클로저는 이런 거구나 이런 표현식으로 적는구나 정도 알고 가자 클로저에 대해서는 따로  자세히 다루어 보겠다. 

 

그럼 일단'클로저에서'라는 구문에 대해서는 이해가 되었다. 그럼 '첫 번째 인수'라는 말은 알겠는데 지금 보고 있는 클로저 표현식과는 다르고.. 🤔 예시를 보면서 어떻게 $0이 나오게 되었는지 보자!! 

 

 

클로저 줄이기 

 

let digits = [1,4,10,15]
let even = digits.filter { (val: Int) -> Bool in return val % 2 == 0 }

 

 

클로저는 Int 매개변수를 취하고 Bool을 반환하여 항목이 필터링되어야 함을 알려준다. 모든 것이 명시적으로 표현되는 긴 형식이다.  이 코드는 내가 알고 있는 클로저 표현식의 형태이다.

매개변수는 함수를 정의할 때 외부로부터 받아들이는 전달 값의 이릉을 의미한다. 전달인자, 혹은 인자는 함수를 실제로 호출할 때 전달하는 값을 의미한다.

 

let even = digits.filter { (val: Int) -> Bool in val % 2 == 0 }

함수에서 무언가를 반환할 때에는 return 키워드를 사용한다. 하지만 함수가 하나의 표현식만을 포함하고 있다면 return 키워드를 생략할 수 있다. 

 

let even = digits.filter { (val: Int) in val % 2 == 0 }

클로저에서 반환 타입을 생략하면 컴파일러는 클로저 표현식의 구문을 해석하여 반환 값을 찾고, 이 값의 타입을 추론하여 클로저의 반환 타입을 정의할 수 있다.

 

let even = digits.filter { val in val % 2 == 0 }

 

인수 유형은 숫자 항목의 유형 [Int]에서 추론되므로 더 단순화할 수 있다. 

 

let even = digits.filter { $0 % 2 == 0 }

 

클로저에서는 매개 변수의 이름도 생략을 할 수 있다. 매개변수의 이름을 명시하지 않아도 $와 숫자의 조합으로 단축 인자 이름을 사용할 수 있다. $0은 클로저의 첫 번째 파라미터를 의미한다. ($1 은 두 번째.. $2은 세 번째)

 

 

'$0' 는 클로저의 단축에 의해서 나온 것을 알 수 있다!!! 

클로저를 단축시키면 코드 길이를 줄일 수 있지만 코드의 가독성이 떨어지기 때문에 사용에 유의하자!!!!

 

 

 

참고 자료

https://babbab2.tistory.com/81

https://developer.apple.com/forums/thread/124678

 

'Swift' 카테고리의 다른 글

[Swift] forEach(_:) 알아보기  (2) 2024.02.17
[Swift] Dictionary  (2) 2024.01.01
[Swift] 삼항연산자  (2) 2023.12.29
[Swift] map{ Int($0)! } vs map{ Int(String($0))! }  (2) 2023.11.18
[Swift] Array.count에서 오류가 난 이유?  (3) 2023.11.16