Swift 3.0二元运算符' =='无法应用

时间:2016-09-19 07:46:50

标签: swift swift3

在Swift 3.0中,当我尝试比较[[String: AnyObject]][[String: AnyObject]]!类型的两个项目时,我收到了一个奇怪的错误。因此,其中一个是强行打开,另一个则没有。

所以比较看起来像:

let smth: [[String: AnyObject]] = [["key": "Value"]]
let smth2: [[String: AnyObject]]?  = someFunctionThatReturnsAnOptionalArrayOfDictionaries()

if smth == smth2! {
    print("Equal")
}

错误说明:Binary operator '==' cannot be applied to operands of type '[[String : AnyObject]]' and '[[String : AnyObject]]!'

在Swift 3中执行此操作的正确方法是什么?

2 个答案:

答案 0 :(得分:4)

这有点棘手,因为你不能直接比较数组或字典(没有重载运算符)。

您可能面临的另一个问题是可选和非可选的比较,已在Swift 3中删除(仅适用于<>==和{{1仍然有用!):

<强> Swift Evolution - Proposal #0121

我做的是让它工作首先用!=打开可选项,然后我将它们与if let进行比较,首先是数组,然后是字典。

elementsEqual

另一个问题是,由于您使用let smth: [[String: AnyObject]] = [["key": "Value" as AnyObject]] let smth2: [[String: AnyObject]]? = nil if let smth2 = smth2, smth.elementsEqual(smth2, by: { (obj1, obj2) -> Bool in return obj1.elementsEqual(obj2) { (elt1, elt2) -> Bool in return elt1.key == elt2.key && elt1.value === elt2.value } }) { print("Equal") } 作为值,因此无法直接比较它们。这就是为什么我使用AnyObject来检查比较对象的引用是否相同。不确定这是不是你想要的。

答案 1 :(得分:2)

This SO回答包含“Xcode 8 beta 6•Swift 3”小标题下的此问题的解决方案。

特别注意:

  

在上面的示例中,所有字典键和值都是相同的类型。如果我们尝试比较两个类型为[String:Any]的字典,Xcode会抱怨二元运算符==不能应用于两个[String:Any]操作数。 ...但我们可以使用NSDictionary初始化程序扩展==运算符功能: