的覆盖方法具有不兼容的类型

的覆盖方法具有不兼容的类型

本文介绍了使用选择器 '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 bridgeswith NSSet. This is mentioned in the Swift blog and in theXcode 6.3 release notes, (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) ->()'的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

07-24 04:19