bub*_*uba 63 dictionary compare swift
是否有一种简单的方法来比较[String: AnyObject]swift中的两个词典,因为它不接受==运算符?
通过比较两个词典,我的意思是检查它们是否具有相同的确切键,并且对于每个键,它们具有相同的值.
Leo*_*bus 100
正如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
Run Code Online (Sandbox Code Playgroud)
您还可以实现自定义运算符"==",如下所示:
public func ==(lhs: [String: AnyObject], rhs: [String: AnyObject] ) -> Bool {
return NSDictionary(dictionary: lhs).isEqualToDictionary(rhs)
}
println(dic1 == dic2) // true
println(dic1 == dic3) // false
Run Code Online (Sandbox Code Playgroud)
Xcode 9•Swift 4
从文档中,字典现在被定义为结构:
struct Dictionary<Key : Hashable, Value> : Collection, ExpressibleByDictionaryLiteral
Run Code Online (Sandbox Code Playgroud)
描述
一个集合,其元素是键值对.字典是一种哈希表,可以快速访问它包含的条目.表中的每个条目都使用其密钥进行标识,密钥是可清除的类型,例如字符串或数字.您可以使用该键来检索相应的值,该值可以是任何对象.在其他语言中,类似的数据类型称为散列或关联数组.使用字典文字创建新字典.字典文字是以逗号分隔的键值对列表,其中冒号将每个键与其关联值分开,并用方括号括起来.您可以将字典文字分配给变量或常量,或将其传递给需要字典的函数.
以下是如何创建HTTP响应代码及其相关消息的字典:
var responseMessages = [200: "OK",
403: "Access forbidden",
404: "File not found",
500: "Internal server error"]
Run Code Online (Sandbox Code Playgroud)
推断responseMessages变量具有类型
[Int: String].字典的Key类型是,字典Int的Value类型是String.
要创建没有键值对的字典,请使用空字典文字([:]).
var emptyDict: [String: String] = [:]
Run Code Online (Sandbox Code Playgroud)
任何符合Hashable协议的类型都可以用作字典的Key类型,包括Swift的所有基本类型.您可以使用自己的自定义类型作为字典键,使其符合Hashable协议.
我们不再需要定义自定义运算符:
来自文档:
static func ==(lhs: [Key : Value], rhs: [Key : Value]) -> Bool
Run Code Online (Sandbox Code Playgroud)
测试:
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
Run Code Online (Sandbox Code Playgroud)
在上面的示例中,所有字典键和值都是相同的类型.如果我们尝试比较[String: Any]Xcode 类型的两个字典会抱怨二元运算符==不能应用于两个[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
Run Code Online (Sandbox Code Playgroud)
但是我们可以扩展==实现中缀运算符的运算符功能,将Swift Dictionary转换为NSDictionary并将字典值约束为Hashable Protocol:
public func ==<K, L: Hashable, R: Hashable>(lhs: [K: L], rhs: [K: R] ) -> Bool {
(lhs as NSDictionary).isEqual(to: rhs)
}
Run Code Online (Sandbox Code Playgroud)
测试:
let dic4: [String: AnyHashable] = ["key1": 100, "key2": "200"]
let dic5: [String: AnyHashable] = ["key1": 100, "key2": "200"]
let dic6: [String: AnyHashable] = ["key1": 100, "key2": Date()]
Run Code Online (Sandbox Code Playgroud)
print(dic4 == dic5) // true
print(dic4 == dic6) // false
Run Code Online (Sandbox Code Playgroud)
Ami*_*aiB 14
比较字典现在是原生的!(文件在这里)
Leo Dabus已经拥有一份出色的书面文章和公认的解决方案.然而,对我来说,我发现它还需要一个步骤才能完全使用.正如您从他的代码中看到的那样,您需要将字典类型设置为[AnyHashable: Any],或者您将获得Binary operator '==' cannot be applied to two '[String : Any]' operands,在我的示例中使用反序列化JSON时常用的字典.
救援的仿制药!:
// Swift 3.0
func == <K, V>(left: [K:V], right: [K:V]) -> Bool {
return NSDictionary(dictionary: left).isEqual(to: right)
}
Run Code Online (Sandbox Code Playgroud)
或者在另一个案例中,我有[String: Any?]:
func == <K, V>(left: [K:V?], right: [K:V?]) -> Bool {
guard let left = left as? [K: V], let right = right as? [K: V] else { return false }
return NSDictionary(dictionary: left).isEqual(to: right)
}
Run Code Online (Sandbox Code Playgroud)
jtb*_*des 11
在斯威夫特2,当这两个Key和Value是Equatable,你可以使用==的字典本身:
public func ==<Key : Equatable, Value : Equatable>(lhs: [Key : Value], rhs: [Key : Value]) -> Bool
Run Code Online (Sandbox Code Playgroud)
并且,NSObject是Equatable:
public func ==(lhs: NSObject, rhs: NSObject) -> Bool
Run Code Online (Sandbox Code Playgroud)
在您的情况下,如果您正在使用要比较的Obj-C对象,则isEqual:可以简单地使用NSObject作为您的值类型(而不是AnyObject).
| 归档时间: |
|
| 查看次数: |
31112 次 |
| 最近记录: |