web-dev-qa-db-ja.com

Swift 2のfuncエラーをオーバーライドします

XCode 6のこのコードにはエラーはありませんが、XCode 7(Swift 2)ではこのエラーが発生しています。

メソッドはスーパークラスのメソッドをオーバーライドしません

override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {
        /* Called when a touch begins */

}

override Wordを削除すると、このエラーが発生しました:

Objective-Cセレクター 'touchesBegan:withEvent:'を使用するメソッド 'touchesBegan(:withEvent :)'は、同じObjective-Cセレクターを持つスーパークラス 'UIResponder'のメソッド 'touchesBegan(:withEvent :)'と競合します

42
nmokkary

Cocoa Touchの多くがObjective-Cジェネリックをサポートするために監査されているため、最初のエラーが発生しています。つまり、配列やセットなどの要素を入力できるようになりました。この結果、このメソッドのシグネチャが変更され、記述した内容がこれと一致しなくなったため、メソッドをoverrideとしてマークしたことを説明するエラーが表示されますが、 tは実際にスーパークラスのメソッドに一致します。

次に、overrideキーワードを削除すると、実際のtouches beginメソッドとObjective-Cセレクターが競合するメソッドを作成したことを通知します(Swift、Objective- Cはメソッドのオーバーロードをサポートしていません)。

一番下の行は、Swift 2で、タッチがオーバーライドを開始すると、このようになります。

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
    // stuff
}

Objective-CジェネリックのSwiftコードに対する意味については、プレリリース版の sing Swift CocoaおよびObjective-Cを使用 。現在33ページおよび34ページ。

77
Mick MacCallum

オーバーライドを削除するだけで機能します。

func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {
        /* Called when a touch begins */

}
2
Swift Developer