web-dev-qa-db-ja.com

セレクター 'touchesBegan:withEvent:'を使用するメソッドをオーバーライドすると、互換性のないタイプ '(NSSet、UIEvent)->()'

Xcode 6.3。 UITextFieldDelegateプロトコルを実装するクラス内で、touchesBegan()メソッドをオーバーライドしてキーボードを非表示にする場合があります。関数仕様でコンパイラエラーを回避すると、SetまたはNSSetから「タッチ」を読み取ろうとするコンパイラエラーが発生するか、super.touchesBegan(touches、withEvent:event)がエラーをスローします。 Xcode 6.2でコンパイルされたこれらの組み合わせの1つ! (それではSwift "Set"のドキュメントはどこにあり、そこから要素を取得する方法は?)

 override func touchesBegan(touches: NSSet, withEvent event: UIEvent) { 
    // Hiding the Keyboard when the User Taps the Background
        if let touch =  touches.anyObject() as? UITouch {
            if nameTF.isFirstResponder() && touch.view != nameTF {
                nameTF.resignFirstResponder();
            }
        }
        super.touchesBegan(touches , withEvent:event)
    }

試してください:

override func touchesBegan(touches: NSSet, withEvent event: UIEvent) or
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent) 

コンパイラエラー:セレクター 'touchesBegan:withEvent:'でメソッドをオーバーライドすると、互換性のないタイプ '(NSSet、UIEvent)->()'および

super.touchesBegan(touches , withEvent:event)

また文句を言う

「NSSet」は「Set」に暗黙的に変換できません。 「as」を使用して明示的に変換するつもりでしたか?

試してください:

override func touchesBegan(touches: Set<AnyObject>, withEvent event: UIEvent) 

コンパイラエラー:タイプ「AnyObject」はプロトコル「Hashable」に準拠していません

試してください:

override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) 

のコンパイラエラー

if let touch = touches.anyObject() as? UITouch 

「Set」には「anyObject」という名前のメンバーはありませんが、関数の仕様とsuper()の呼び出しは問題ありません!

試してください:

override func touchesBegan(touches: NSSet<AnyObject>, withEvent event: UIEvent) -> () or
override func touchesBegan(touches: NSSet<NSObject>, withEvent event: UIEvent) 

コンパイラエラー:非ジェネリック型 'NSSet'を特殊化できません

76
SoCor

Swift 1.2(Xcode 6.3)は、SetとブリッジするネイティブのNSSetタイプを導入しました。これは Swiftブログ および Xcode 6.3リリースノート で言及されています。 しかし、どうやら公式文書にはまだ追加されていないようです (更新: Ahmad Ghadiri指摘 として、それはは現在文書化されています)。

UIResponderメソッドは、

func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent)

次のようにオーバーライドできます。

override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {
    if let touch = touches.first as? UITouch {
        // ...
    }
    super.touchesBegan(touches , withEvent:event)
}

Swift 2の更新(Xcode 7):(比較 Swiftのfuncエラーを上書き2

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
    if let touch = touches.first {
        // ...
    }
    super.touchesBegan(touches, withEvent:event)
}

Swift 3:の更新

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    if let touch = touches.first {
        // ...
    }
    super.touchesBegan(touches, with: event)
}
160
Martin R

XCode 7およびSwift 2.0では、次のコードを使用します。

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

    if let touch =  touches.first{
        print("\(touch)")
    }
    super.touchesBegan(touches, withEvent: event)
}

override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) {

    if let touch = touches.first{
        print("\(touch)")
    }
    super.touchesEnded(touches, withEvent: event)
}

override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?) {

    if let touch = touches.first{
        print("\(touch)")
    }
    super.touchesMoved(touches, withEvent: event)
}
10

SwiftおよびXcode 8を使用する

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {

}

override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {

}

override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {

}

override func touchesCancelled(_ touches: Set<UITouch>?, with event: UIEvent?) {
// Don't forget to add "?" after Set<UITouch>
}
10

XCode 7.2 _2015年12月19日にリリースされた最新の更新プログラムの現在の最新バージョンSwift 2.1.

次回このようなエラーが発生した場合は、関数を削除して「touchesBe ...」と再度入力し始めると、xCodeは古い関数を修正するのではなく、自動的に最新のものに修正します。

override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?) {

    for touch: AnyObject! in touches {
        let touchLocation = touch.locationInNode(self)

        //Use touchLocation for example: button.containsPoint(touchLocation) meaning the user has pressed the button.
    }
}
6
Jose Ramirez

これはApple AP​​Iリファレンスにあります here で、xCodeバージョン6.3およびSwift 1.2でオーバーライドするには、次のコードを使用できます。

override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {
    if let touch =  touches.first as? UITouch {
         // ...
    }
    // ...
}
6
Ahmad Ghadiri

小さな追加。 Swiftをエラーなしでコンパイルするには、追加する必要があります

インポートUIKit.UIGestureRecognizerSubclass

4
beshio

私のために働いたのは:

    override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {
        if let touch = touches.first as? UITouch {
            // ...
        }

        super.touchesBegan(touches , withEvent:event!)
    }
4
jfredsilva

Swift 4およびXcode 9の使用

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {

}
0
ammar shahid