2016-09-04 6 views
1

NSControlTextEditingDelegateプロトコルを実装していますが、どのクラス/プロトコルiと一致させるべきか分かりません。 commandSelector。 #selector(WhichClass.moveUp(_ :))、等価性が成立するようにします。swiftでNSResponderセレクタを更新するには2.2

現在、すべてが2.1迅速でokです:

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) || 

希望する場合は、次のように書くことができます。

実際に
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:」など)が等しい場合、2つのセレクタは等しいです。心配しないでください。 – OOPer

関連する問題