2016-09-04 10 views
1

NSControlTextEditingDelegate 프로토콜을 구현 중이며 어떤 클래스/프로토콜 중 하나와 일치해야하는지 모르겠습니다. commandSelector. #selector (WhichClass.moveUp (_ :)) 그러면 평등이 통과됩니다.신속하게 NSResponder 선택기를 업데이트하는 방법 2.2

현재의 모든 SWIFT 2.1 괜찮 : 당신이 원하는 경우

if (commandSelector == #selector(NSResponder.moveUp) || 

당신은 다음과 같이 쓸 수 있습니다 :

func control(control: NSControl, textView: NSTextView, doCommandBySelector commandSelector: Selector) -> Bool { 

    var goUp = false 
    var goDown = false 

     if (commandSelector == Selector("moveUp:") || 
     commandSelector == Selector("moveBackward:") || 
     commandSelector == Selector("moveUpAndModifySelection:") || 
     commandSelector == Selector("moveParagraphBackwardAndModifySelection:") 
      ) 

     { 
      goUp = true 
     } 
     if (commandSelector == Selector("moveDown:") || 
     commandSelector == Selector("moveForward:") || 
     commandSelector == Selector("moveDownAndModifySelection:") || 
     commandSelector == Selector("moveParagraphForwardAndModifySelection:") 
      ) { 
      goDown = true 

     } 
//... 
} 

답변

1

이 시도 사실

if (commandSelector == #selector(NSResponder.moveUp(_:)) || 

을, 생성 Selector#selector 인스턴스에서 클래스 정보를 포함하지 않습니다. 따라서 같은 서명을 가진 동일한 메소드를 정의하는 클래스를 찾을 수 있습니다.


그리고 어떤 클래스도 찾을 수없는 경우 자신의 프로토콜에서 정의하고 프로토콜 이름을 사용할 수 있습니다.

if (commandSelector == #selector(MyProtocol.moveUp(_:)) || 

후자는 마지막 방법으로해야하지만, 실제로 작동합니다

@objc protocol MyProtocol { 
    func moveUp(_:AnyObject) 
    //... 
} 

그리고 #selector에서 사용.

+0

답변 해 주셔서 감사합니다. 평등에 대해 걱정할 필요가 없습니까? –

+0

@MarekH, 쉽게 확인할 수 있습니다. '#selector (MyProtocol.moveUp (_ :)) == #selector (NSResponder.moveUp)'는 true를 반환합니다. Objective-C 표기법 (예 : "moveUp :")이 같으면 두 개의 선택기가 동일합니다. 걱정마. – OOPer