2016-06-17 4 views
1
let button = UIButton() 
button.addTarget(self, action: #selector(MyClass.handleButton(_:)), forControlEvents: .TouchUpInside) 

@objc private func handleButton(sender: UIButton!) 
{ 
} 

난 아직도 스위프트 함께 시작 해요, 그래서이 종류의 기본이 될 수도 있지만 handleButton의 인수 후 @objc 키워드 MyClass.handleButton(_:)에 밑줄, 그리고 느낌표와 무슨 일이 일어나고 있는지? 나는 오래된 프레임 워크가 obj-c에 있다는 것을 모았고 Swift가 어떤 식 으로든 그것에 연결되어 있지만 구문을 얻지는 못한다. 버튼을 프로그래밍 방식으로 신속하게 설정하는 더 좋은 방법이 있습니까? 그것의 위에 겹쳐지기 때문에이 경우 obj-c보다 천천히 움직이지 않겠는가?UIButton에 대상을 추가 할 때 Swift가 백그라운드에서 수행하는 작업은 무엇입니까?

+0

'@ objc'는 속성입니다. 'handleButton (_ :)'은 함수에 대한 참조입니다. 'UIButton!'은 암묵적으로 언 래핑 된 선택적 타입입니다. – jtbandes

+0

'@ obj-c'는 private 메소드를 obj-c에 공개합니다. 당신의 행동이 사적인 것이 아니었다면 그것을 사용하지 않아도됩니다. 그것이 이유가 있습니까? – Ike10

답변

1

@objc 키워드는 어떻게됩니까?

addTargetaction 매개 변수는 당신이 목표 - C 함수에 대한 포인터로 생각할 수있는하는 Selector입니다. 함수에 대한 선택자를 얻으려면이 함수는 Objective-C로 작성된 Apple 프레임 워크에서 호출되기 때문에 Objective-C으로 볼 수 있어야합니다. 1) 클래스가 NSObject의 하위 클래스이거나 NSObject (예 : UIViewController)을 상속하는 클래스에서 상속되어야하거나 2) Swift 함수에 @objc 특성을 추가하여 해당 클래스를 노출해야하는 경우 Objective-C에 대한 신속한 방법.

MyClass.handleButton (_ :)의 밑줄?

밑줄은 handleButton의 첫 번째 인수를 나타냅니다. Objective-C에서 첫 번째 매개 변수의 이름은 지정되지 않으므로 Swift에서 _으로 표시됩니다. 매개 변수의 이름이 지정되지 않은 와일드 카드입니다.

MyClass.handleButton(_:)은 하나의 매개 변수를 사용하는 MyClass 클래스에 정의 된 handleButton이라는 함수를 지정합니다.

당신의 handleButton이 같은 두 개의 매개 변수, 촬영 한 경우 :

@objc func handleButton(button: UIButton, forEvent event: UIEvent) { 
} 

다음 선택이되었을 것이다 #selector(MyClass.handleButton(_:forEvent:))

handleButtonforEvent라는 이름의 두 번째와 2 개 개의 인수를 취하는 것을 보여주는.

선택기를 지정할 때 전체 이름보다 적게 지정할 수 있습니다. 클래스 이름을 다음과 같이 쓸 수 있습니다.

컴파일러는 현재 클래스에서 함수를 찾습니다.

클래스에서 오직 하나 개 handleButton 기능 (이 과부하되지는) 당신도 인수 사양을 생략 할 수있는 경우 :

handleButton의 인수 후
#selector(handleButton) 

느낌표?여기

@objc private func handleButton(sender: UIButton!) 
{ 
} 

UIButton!은 당신이 (!로) 그 랩을 해제하지 않고도 사용할 수있는 옵션을 의미하는 옵션 암시 적으로 풀어 입니다. 이렇게하면 호출자는 UIButton에 대한 참조 대신 nil을 전달할 수 있지만 sender을 사용하려고 시도하면 언제든지 충돌 할 수 있습니다.

선택 사항 일 필요는 없습니다. 항상 UIButton을 전달하므로 불필요한 !을 제거하십시오.

Swift에서 프로그램 방식으로 버튼을 설정하는 더 좋은 방법이 있습니까?

내가 이미 언급 한 선택기의 단축키 이외에 다른 것은 아닙니다.

스위프트는이 경우 계층 적이므로이 경우 obj-c보다 느리지 않습니까?

Objective-C 런타임에 인터페이스하고 있습니다. Apple 엔지니어는 똑똑하고 신속하고 효율적으로 작업합니다. 이것의 효율성은 특히 사용자가 버튼을 누를 때만 호출되는 사용자 인터페이스 메소드 (예 : 수백만 초가 아닌)에 대해 걱정해야 할 사항이 아닙니다.

관련 문제