当前位置: 首页 > 面试题库 >

使用选择器'touchesBegan:withEvent:'的重写方法具有不兼容的类型'(NSSet,UIEvent)->()'

贺靖
2023-03-14
问题内容

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


 类似资料:
  • 我们有: 在models.py 在serializers.py 当我通过mypy检查它时: 资源/序列化程序。py:67:错误:赋值中的类型不兼容(表达式的类型为“Union[Any,object]”,变量的类型为“int”) 请通过mypy进行检查: 资源/serializers.py:68:错误:查找'language_id'的不兼容类型:(得到了"Union[any,对象]",预期为"Uni

  • 问题内容: 我有以下代码 由于某种原因,它会引发以下编译错误 Solution.java:11:错误:不兼容的类型:推断变量T具有不兼容的边界List list = Arrays.asList(A); ^等式约束:整数下限:int []其中T是类型变量:T扩展了在方法asList(T …)中声明的对象 我假设这是Java 8功能,但是我不确定如何解决该错误 问题答案: 期望可变数量的。不是,而是,

  • 问题内容: 我读过一本书,说如果签名相同,我可以覆盖一个方法。根据书中的方法签名是Method_Name + Parameters传递的。 根据这本书,我可以重写具有不同返回类型的方法。在Java中实际上是否可以覆盖具有不同返回类型的方法?因为我在网上进行了一些搜索,所以我发现有人说要覆盖方法,返回类型也应该相同。 根据这本书,它还说,当我们尝试重载具有相同方法名称和参数但返回类型不同的方法时,j

  • 我读过一本书,它说我可以覆盖一个方法,如果它有相同的签名。根据这本书,方法的签名是Method_Name参数传递。 根据这本书,我可以重写具有不同返回类型的方法。在Java中,是否可以用不同的返回类型重写方法?因为我在网上做了一些搜索,我发现有人说要覆盖一个方法,返回类型也应该相同。 根据这本书,它还说,当我们试图用相同的方法名和参数重载一个方法,但返回类型不同时,java会抛出编译错误,因为签名

  • 在处理一些旧代码时,我偶然发现了一个问题,用lambda表达式或方法引用替换了几个匿名类。这个问题有点难以用语言来解释,但我会尽我所能,下面我还添加了一个简短的例子,尽我所能来说明我的问题。 我的示例包括。。。 > 一个函数接口,GenericListener,它接受类型参数V并具有单个方法“GenericCallback(V GenericValue)”。 一个类,CallbackProduce

  • 和是的一部分,如下所示: