Swift의 Closure에서 '$ 0'은 결국 누구입니까?

8827 단어 Swift
요 전날, 업무로 Swift의 Closure에 대해 설명할 기회가 있었는데, 「Swift의 Closure에 있어서.

원래 Closure는 뭐야.



Sift. 오 rg 에 의하면, 다음의 정의가 되고 있습니다.

Closures are self-contained blocks of functionality that can be passed around and used in your code.
번역: 클로저는 코드 내에서 전달하고 사용할 수 있는 기능의 자체 완결형 블록입니다.

이 기능(원문에서는 functionality)이라는 부분이 중요하고, Closure를 이용하면 무엇인가 임의의 행동을 다른 어딘가에 건네주고, 자신의 코드의 개소가 아닌 전혀 다른 장소에서 행동을 일으킬 수 있다고 하는 것이 재미있는 점이라고 생각합니다.
(여기서의 행동은 무엇인가 변수를 조작하거나, 성공시의 핸들러라고 하는 것 같은 프로그램으로서의 움직임 전반을 가리키고 있습니다)

Closure는 어떻게 쓰는 거야 & $0은 뭐야.



Swift의 Closure는 다음과 같이 설명 할 수 있습니다.
let result: ((Int) -> Bool) = { price -> Bool in
    if price < 1500 {
        return true
    } else {
        return false
    }
}

이것만으로 간단하기 때문에 아래와 같이 더 짧게 할 수 있습니다.
let result((Int) -> Bool) = { price -> Bool in
    return price < 1500
}

이 방법을 사용하면 $0의 줄 바꿈도 제거 할 수 있으므로 다음과 같이 청소할 수 있습니다
let result((Int) -> Bool) = { price -> Bool in return price < 1500 }

Closure의 Shorthand Argument Names



위를 여러 번 정의에서 쓰는 것은 힘들기 때문에 여기서 Swift가 신경을 써주고 클로저가 1행일 때는 클로저 내부에서 이용할 수 있다. 해줘.
let result: ((Int) -> Bool) = { return $0 < 1500 }

Swift.org에서 다음과 같이 설명합니다.

Swift automatically provides shorthand argument names to inline closures, which can be used to refer to the values ​​of the closure’s arguments by the names\$0,\$1,\$2, and so on.
번역 : Swift는 인라인 클로저에 단축 인수 이름을 자동으로 제공합니다. 이를 사용하여 클로저 인수의 값을 $0, $1, $2 등의 이름으로 참조할 수 있습니다.

이 때문에, Swift의 Closure에서 자주 사용하고 있다 return price <= 1500 는 실은, Swift가 신경쓰게 해 만들어 주는 가인수명이야, 라고 하는 이야기였습니다.

보충: $0는 충돌합니다.



closure에 closure를 쓰려는 경우 $0를 사용하면 이름이 충돌하여 컴파일 할 수 없습니다.
let sources = [[1,2,3,4,5,6,7,8,9,10],[1,2,3,4,5,6,7,8,9,10],[1,2,3,4,5,6,7,8,9,10]]

sources.forEach({ print($0.forEach({ print($0) }) })
// ↑ $0の名前が衝突してコンパイルできなくなる

그래서이 경우 솔직하게 인수 이름을 정의해 봅시다.
let sources = [[1,2,3,4,5,6,7,8,9,10],[1,2,3,4,5,6,7,8,9,10],[1,2,3,4,5,6,7,8,9,10]]

sources.forEach({ values -> Void in print(values.forEach({ value -> Void in print(value) })) })

위의 예에서는 어느 쪽에도 인수를 정의하고 있습니다만, $0 가 충돌만 하지 않으면 괜찮기 때문에, 어느 쪽인가 한쪽만으로도 괜찮다고 생각합니다(아마)

이것으로 내일부터 컴파일 에러에 곤란해도 아마 괜찮습니다!

좋은 웹페이지 즐겨찾기