使用选择器 'touchesBegan:withEvent:' 的覆盖方法具有不兼容的类型 '(NSSet, UIEvent) ->()' [英] Overriding method with selector 'touchesBegan:withEvent:' has incompatible type '(NSSet, UIEvent) -> ()'

查看:17
本文介绍了使用选择器 'touchesBegan:withEvent:' 的覆盖方法具有不兼容的类型 '(NSSet, UIEvent) ->()'的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

Xcode 6.3.在实现 UITextFieldDelegate 协议的类中,我想覆盖 touchesBegan() 方法以可能隐藏键盘.如果我避免函数规范中的编译器错误,那么尝试从 Set 或 NSSet 读取touch"时会出现编译器错误,否则 super.touchesBegan(touches , withEvent:event) 会引发错误.这些组合之一在 Xcode 6.2 中编译!(那么 Swift Set" 的文档在哪里以及如何从一个元素中获取元素?)

Xcode 6.3. Within a class implementing UITextFieldDelegate protocol, I would like to override touchesBegan() method to possibly hide the keyboard. If I avoid a compiler error in the function spec, then there is a complier error trying to read the "touch" from the Set or NSSet, or else the super.touchesBegan(touches , withEvent:event) throws an error. One of these combinations compiled in Xcode 6.2! (So where is documentation to Swift "Set" and how to get an element from one?)

 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) -> ()'和

Compiler error: Overriding method with selector 'touchesBegan:withEvent:' has incompatible type '(NSSet, UIEvent) -> ()' and

super.touchesBegan(touches , withEvent:event)

也抱怨

'NSSet' 不能隐式转换为 'Set';您的意思是使用as"来显式转换吗?

'NSSet' is not implicitly convertible to 'Set'; did you mean to use 'as' to explicitly convert?

试试:

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

编译错误:类型AnyObject"不符合协议Hashable"

Compiler error: 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() 的调用是可以的!

'Set' does not have a member named 'anyObject' BUT the function spec and call to super() are OK!

试试:

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

编译错误:不能专门化非泛型类型NSSet"

Compiler error: Cannot specialize non-generic type 'NSSet'

推荐答案

Swift 1.2 (Xcode 6.3) 引入了一个原生的 Set 类型来桥接使用 NSSet.这在 Swift 博客Xcode 6.3 发行说明但显然尚未添加到官方文档中(更新:正如Ahmad Ghadiri 指出的 现已记录在案).

Swift 1.2 (Xcode 6.3) introduced a native Set type that bridges with NSSet. This is mentioned in the Swift blog and in the Xcode 6.3 release notes, but apparently not yet added to the official documentation (update: As Ahmad Ghadiri noted, it is documented now).

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

这篇关于使用选择器 'touchesBegan:withEvent:' 的覆盖方法具有不兼容的类型 '(NSSet, UIEvent) ->()'的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆