更新: SE-0143 条件一致性已在Swift 4.2 中实现。
因此,您的代码现在可以编译。如果你定义Item
为一个结构
struct Item: Equatable {
let item: [[Modifications: String]]
init(item: [[Modifications: String]]) {
self.item = item
}
}
然后编译器==
自动合成运算符,比较SE-0185 Synthesizing Equatable 和 Hashable 的一致性
(前 Swift 4.1 答案:)
问题是即使==
是为字典类型定义的
[Modifications: String]
,该类型也不符合
Equatable
。因此数组比较运算符
public func ==<Element : Equatable>(lhs: [Element], rhs: [Element]) -> Bool
不能应用于[[Modifications: String]]
。
==
for的一个可能的简洁实现Item
是
func ==(lhs: Item, rhs: Item) -> Bool {
return lhs.item.count == rhs.item.count
&& !zip(lhs.item, rhs.item).contains {$0 != $1 }
}
您的代码编译为[[String: String]]
- 如果 Foundation 框架被导入,正如@user3441734 正确所说的那样 - 因为 then[String: String]
会自动转换为NSDictionary
符合
Equatable
. 这是该声明的“证明”:
func foo<T : Equatable>(obj :[T]) {
print(obj.dynamicType)
}
// This does not compile:
foo( [[Modifications: String]]() )
// This compiles, and the output is "Array<NSDictionary>":
foo( [[String: String]]() )