[String: AnyObject]因为不接受==运算符,有没有一种快速比较两个字典的简便方法?
[String: AnyObject]
==
通过比较两个字典,我的意思是检查它们是否具有相同的精确键,并且对于每个键都具有相同的值。
正如Hot Licks所述,您可以使用NSDictionary方法isEqualToDictionary()来检查它们是否相等,如下所示:
let dic1: [String: AnyObject] = ["key1": 100, "key2": 200] let dic2: [String: AnyObject] = ["key1": 100, "key2": 200] let dic3: [String: AnyObject] = ["key1": 100, "key2": 250] println( NSDictionary(dictionary: dic1).isEqualToDictionary(dic2) ) // true println( NSDictionary(dictionary: dic1).isEqualToDictionary(dic3) ) // false
您还可以实现自定义运算符“ ==”,如下所示:
public func ==(lhs: [String: AnyObject], rhs: [String: AnyObject] ) -> Bool { return NSDictionary(dictionary: lhs).isEqualToDictionary(rhs) } println(dic1 == dic2) // true println(dic1 == dic3) // false
Xcode 9•Swift 4
从文档开始,字典现在被定义为一个结构:
struct Dictionary<Key : Hashable, Value> : Collection, ExpressibleByDictionaryLiteral
描述 一个集合,其元素为键值对。字典是一种哈希表,可快速访问它所包含的条目。表中的每个条目都使用其键来标识,该键是可哈希的类型,例如字符串或数字。您可以使用该键检索相应的值,该值可以是任何对象。在其他语言中,类似的数据类型称为哈希或关联的数组。通过使用字典文字来创建新字典。字典文字是键值对的逗号分隔列表,其中冒号将每个键与其关联的值分开,并用方括号括起来。您可以将字典文字分配给变量或常量,也可以将其传递给需要字典的函数。
描述
一个集合,其元素为键值对。字典是一种哈希表,可快速访问它所包含的条目。表中的每个条目都使用其键来标识,该键是可哈希的类型,例如字符串或数字。您可以使用该键检索相应的值,该值可以是任何对象。在其他语言中,类似的数据类型称为哈希或关联的数组。通过使用字典文字来创建新字典。字典文字是键值对的逗号分隔列表,其中冒号将每个键与其关联的值分开,并用方括号括起来。您可以将字典文字分配给变量或常量,也可以将其传递给需要字典的函数。
这是创建HTTP响应代码及其相关消息的字典的方法:
var responseMessages = [200: "OK", 403: "Access forbidden", 404: "File not found", 500: "Internal server error"]
推断responseMessages变量具有type [Int: String]。字典的键类型是,字典Int的值类型是String。
[Int: String]
Int
String
要创建没有键值对的字典,请使用空的字典文字([:])。
var emptyDict: [String: String] = [:]
任何符合Hashable协议的类型都可以用作字典的Key类型,包括Swift的所有基本类型。通过使它们符合哈希协议,可以将自己的自定义类型用作字典键。
我们不再需要定义自定义运算符:
从文档:
static func ==(lhs: [Key : Value], rhs: [Key : Value]) -> Bool
测试:
let dic1 = ["key1": 100, "key2": 200] let dic2 = ["key1": 100, "key2": 200] let dic3 = ["key1": 100, "key2": 250] print(dic1 == dic2) // true print(dic1 == dic3) // false
在上面的示例中,所有字典键和值都是相同的类型。如果我们尝试比较两个[String: Any]Xcode 类型的字典,则会抱怨Binary运算符==不能应用于两个[String: Any]操作数。
[String: Any]
let dic4: [String: Any] = ["key1": 100, "key2": "200"] let dic5: [String: Any] = ["key1": 100, "key2": "200"] let dic6: [String: Any] = ["key1": 100, "key2": Date()] print(dic4 == dic5) // Binary operator == cannot be applied to two `[String: Any]` operands
但是我们可以扩展==操作符功能,实现一个中缀操作符,将Swift字典转换为NSDictionary并将字典值限制为Hashable Protocol:
Xcode 11•Swift 5.1
public func ==<K, L: Hashable, R: Hashable>(lhs: [K: L], rhs: [K: R] ) -> Bool { (lhs as NSDictionary).isEqual(to: rhs) }
let dic4: [String: AnyHashable] = ["key1": 100, "key2": "200"] let dic5: [String: AnyHashable] = ["key1": 100, "key2": "200"] let dic6: [String: AnyHashable] = ["key1": 100, "key2": Date()]
print(dic4 == dic5) // true print(dic4 == dic6) // false
let dic7: [String: String] = [ "key2": "200"] let dic8: [String: Date] = [ "key2": Date()] print(dic7 == dic8) // false