2017-07-13 15 views
2

私はSKSceneでスワイプ認識を設定していますが、すべての認識器がハードコーディングに時間がかかることがわかりました。 forループと、UISwipeRecognizerをキーとする辞書を使用し、()は値として機能します。宣言しながら、'#selector'の引数が '@objc'メソッドを参照していません

class xxxxx: SKScene { 

let rightSwipeRecognizer = UISwipeGestureRecognizer() 
let leftSwipeRecognizer = UISwipeGestureRecognizer() 
let upSwipeRecognizer = UISwipeGestureRecognizer() 
let downSwipeRecognizer = UISwipeGestureRecognizer() 

var swipeRecognizers: [UISwipeGestureRecognizer] { 
    return [rightSwipeRecognizer, leftSwipeRecognizer, upSwipeRecognizer, downSwipeRecognizer] 
} 

var directionForRecognizer: [UISwipeGestureRecognizer : UISwipeGestureRecognizerDirection] { 
    return [ 
     rightSwipeRecognizer : .right, 
     leftSwipeRecognizer : .left, 
     upSwipeRecognizer : .up, 
     downSwipeRecognizer : .down 
    ] 
} 

func didSwipeRight() {} 
func didSwipeLeft() {} 
func didSwipeUp() {} 
func didSwipeDown() {} 

var functionForRecognizer: [UISwipeGestureRecognizer :()] { 
    return [ 
     rightSwipeRecognizer : didSwipeRight(), 
     leftSwipeRecognizer : didSwipeLeft(), 
     upSwipeRecognizer : didSwipeUp(), 
     downSwipeRecognizer : didSwipeDown() 
    ] 
} 

func setupSwipeRecognizers() { 
    for recognizer in swipeRecognizers { 
     recognizer.addTarget(self, action: #selector(functionForRecognizer[recognizer]!)) 
     recognizer.direction = directionForRecognizer[recognizer]! 
     self.view?.addGestureRecognizer(recognizer) 
    } 
} 

override func didMove(to view: SKView) { 
    super.didMove(to: view) 
    setupSwipeRecognizers() 
} 

}

ところで、私は@objcを入れてみました:問題はここrecognizer.addTarget(self, action: #selector(functionForRecognizer[recognizer]!))

を使用してターゲットを追加しようとしたときに、それがタイトルに私にエラーを与えることであることはコードがあります機能は動作しませんでした。また、クラスをNSObjectに公開しようとしましたが、SKSceneから継承を取り除いてNSObjectに準拠させましたが、それでも動作しませんでした。また、クラスをUIKitクラスに準拠させることはできません.CSSはSKSceneとして必要ですし、UIViewController(SKSceneなし)にも準拠しようとしましたが、まだ動作しませんでした。

答えて

3

スウィフトの#selectorで行うことはできません。代わりに、Selectorクラスのインスタンスを直接辞書に挿入します。

ます。また#selectorの詳細な説明については@objc

@objc // This annotation isn't required in Swift 3, but will be in Swift 4 
func didSwipeRight() {} 

var functionForRecognizer: [UISwipeGestureRecognizer : Selector] { 
    return [ 
     rightSwipeRecognizer : #selector(didSwipeRight) 
    ] 
} 

recognizer.addTarget(self, action: functionForRecognizer[recognizer])) 

で注釈を付ける必要がありますがthis answerを参照してください。要約、#selectorは、Swiftのコンパイラ構成で、存在する必要があるクラスを含め、正確なセレクタ/メソッドが存在することを保証します。括弧内の実際の内容を調べて、それが既知のメソッドかどうかを確認します。functionForRecognizer[recognizer]はメソッド名ではなく、可変+添字メソッド呼び出しです。

関連する問題