在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中执行此操作的正确方法是什么?
答案 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初始化程序扩展==运算符功能: