二元运算符“===”不能应用于“任何?”类型的操作数和“UIBarButtonItem!”

Posted

技术标签:

【中文标题】二元运算符“===”不能应用于“任何?”类型的操作数和“UIBarButtonItem!”【英文标题】:Binary operator '===' cannot be applied to operands of type 'Any?' and 'UIBarButtonItem!' 【发布时间】:2016-09-17 21:31:05 【问题描述】:

以下代码过去可以在 swift 2.2 中编译,在 swift 3.0 中不再编译。我们如何解决这个问题?

错误:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) 
    if sender === saveButton  // Error!
        // ... 
     else if sender === closeButton  // Error!
        // ...
    

【问题讨论】:

你为什么不和==简单比较一下? 你好@EvgenyKarkan,因为我不想比较这两个对象的值。但相反,我需要知道它们是否是同一个实例。有关详细信息,请参阅此:Swift also provides two identity operators (=== and !==), which you use to test whether two object references both refer to the same object instance. 【参考方案1】:

正如错误消息所说。在 Swift 3 中,Objecitve-C id 被导入为 Any,如果没有显式强制转换,您不能为 Any 调用任何操作,包括 ===

试试这个:

if sender as AnyObject? === saveButton 

(其他sender比较都一样。)

请记住,在 Swift 3 中,as AnyObject 已成为最危险的操作之一,您不应在其他情况下使用 as AnyObject

【讨论】:

在 Swift 3 之前,id 是如何导入的? @Honey,Objective-C id 被导入为AnyObject,只有Swift的一些有限值类型可以转换为AnyObject 所以它们的主要区别是:AnyObject 仅适用于引用类型(类),Any 适用于值和引用类型。 ? @OOPer,您在问题中提到“由于 AnyObject 已成为风险最高的操作之一”,您能否再解释一下为什么它如此冒险? @YuchenZhong,可以长文。首先,您最好仔细阅读this thread。并考虑是否要在使用as AnyObject 时生成_SwiftValue 实例。【参考方案2】:

在比较之前尝试使用带有条件强制转换的可选绑定来确定项目的类型:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) 
    if let sender = sender as? UIBarButtonItem, sender === saveButton 
        // ...
     else if let sender = sender as? UIBarButtonItem, sender === closeButton 
        // ...
    

【讨论】:

以上是关于二元运算符“===”不能应用于“任何?”类型的操作数和“UIBarButtonItem!”的主要内容,如果未能解决你的问题,请参考以下文章

二元运算符'+'不能应用于'String'和'() -> String'类型的操作数

二元运算符 % 不能应用于 UInt32 和 int 类型的操作数

解析 / Swift 问题与 tableviewcell“二元运算符'=='不能应用于单元格和 nil 类型的操作数”

二元运算符“+”不能应用于“_”和“字符串”类型的操作数

Swift 3:二元运算符不能应用于 int 和“Int”类型的操作数?

二元运算符“==”不能应用于“字符串?”类型的操作数和 Swift 3 中的“布尔”