2016-08-16 3 views
1

예를 들어,이 코드를 사용하십시오.UIGestureRecognizer를 만들 때 해당 동작에서 # 선택기를 사용하는 이유는 무엇입니까?

let swipe = UISwipeGestureRecognizer(
     target: self, action: #selector(SomeClass.someFunction) 

이유는 무엇입니까 #selector(MyClass.function)? 셀렉터 랩없이 MyClass.function 일 수없는 이유는 무엇입니까? UIGestureRecognizer 문서에서

+1

이것은 레거시 코드와 Objective-C와 관련이 있습니다. API는 Objective-C가있을 때 설계되었으며 메시지 전송 패러다임을 사용합니다. ''objc_msgSend'''. – kandelvijaya

답변

2

#selector은 단지 syntactics를 확인 기능에 래퍼. 코드에 선언 된 메서드가있는 경우에만 테스트합니다. 이렇게하면 objectiv-c 선택자 문자열에 오타가있는 것처럼 보이는 오류를 피할 수 있습니다.

후드 선택기가 거의 다른 방식으로 작동하고 호출 방법을 사용하기 때문에 func에 포인터를 전달할 수 없습니다.

단순히 셀렉터 메서드를 호출하는 것이 아니라 대상에서 셀렉터를 실행하는 것처럼 작동한다고 생각합니다.

#selector에서 클래스 이름을 사용하지 않아도됩니다. 패스 #selector(yourMethod) 또는 #selector(yourMethodWithParam(_:))도 유효합니다.

+0

'self '에 존재하는 메소드에 대해'Selector'를 선언 한 경우에만 클래스 이름을 무시할 수 있습니다. –

0

:

public init(target: AnyObject?, action: Selector) // designated initializer 

그래서 그것은 당신이 쉽게 버그를 소개 할 수 단순한 오타를 해결하기 #selector(SomeClass.someFunction)

0

를 작성해야하는 이유 actionSelector 형 이잖아 될 것이라고 분명, 스위프트 2.2 문자열을 사용 deprecates 선택자 대신 #selector라는 새로운 구문을 도입했습니다.

참조 : - https://swift.org/blog/swift-2-2-new-features/ (컴파일 시간이 선택기 확인)