Xcode
6.3。在实现UITextFieldDelegate协议的类中,我想重写touchesBegan()方法以可能隐藏键盘。如果我避免函数规范中的编译器错误,则尝试从Set或NSSet读取“
touch”时会出现编译器错误,否则super.touchesBegan(touches,withEvent:event)会引发错误。这些组合之一是在Xcode
6.2中编译的!(因此,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”不符合协议“哈希”
尝试:
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”
Swift 1.2(Xcode 6.3)
引入了Set
与桥接的本机类型NSSet
。Swift博客和Xcode6.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中的OverrideFunc错误]
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)
}