1. ホーム
  2. ios

セレクタ 'touchesBegan:withEvent:' を持つメソッドのオーバーライドは、互換性のない型 '(NSSet, UIEvent) -> ()' を持ちます。

2023-09-23 13:51:21

質問

Xcode 6.3です。 UITextFieldDelegateプロトコルを実装するクラス内で、私はおそらくキーボードを隠すためにtouchesBegan()メソッドをオーバーライドしたいと思っています。 私が関数仕様のコンパイラーエラーを避けるならば、SetまたはNSSetから"touch"を読もうとするコンパイラーエラーがあるか、またはsuper.touchesBegan(touches , withEvent:event)がエラーをスローする。 これらの組み合わせの1つは、Xcode 6.2でコンパイルされました! (それで、Swift "Set"と1つから要素を取得する方法に関する文書はどこにあるのでしょうか?)

 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) 

コンパイラーエラーです。 Type 'AnyObject' does not conform to protocol 'Hashable'.

試してください。

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

でのコンパイラーエラー

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

'Set' は 'anyObject' という名前のメンバを持っていませんが、関数仕様と super() への呼び出しはOKです!

試してみてください。

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

コンパイラーエラーです。 非一般的な型 'NSSet' を特殊化できません。

どのように解決するのですか?

Swift 1.2 (Xcode 6.3) が導入され、ネイティブの Set 型が導入されました。 と NSSet . このことは スイフトブログ で、そして 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 2でのfuncのオーバーライドエラー )

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