当前位置: 首页 > 面试题库 >

如何在Swift中比较两个字典?

孙辰阳
2023-03-14
问题内容

[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

要创建没有键值对的字典,请使用空的字典文字([:])。

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]操作数。

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


 类似资料:
  • 问题内容: 我们有两个可选的NSArrays。目的是检查它们是否相等。我的解决方案是 我觉得这太冗长了。它应该以更简洁和易读的方式实现。有谁有更好的解决方案? 问题答案: 这很简单: 正是您想要的。 为什么行得通? 这是比较可选项的运算符 并给出两个操作数是否为,或者两个操作数均为非nil且未包装的操作数相等。 也继承符合,并使用将该方法与进行比较,该方法按on 实现。因此 给出与以下结果相同的结

  • 问题内容: 这是一个简单的问题-给定两个URL,是否有一些内置方法或一个Apache库来确定它们在逻辑上是否相等? 例如,这两个URL相等: 问题答案: 尽管(以及有问题的)这些特定示例 未 返回,但我认为这是唯一可以假定等效的情况(因为HTTP协议中没有空路径)。 这些URI 并且可以 不 被认为是等价的。 也许您可以使用包装在实用程序中的方法来显式处理此特定情况。

  • 问题内容: 我有两个。每个大小为100000。我想比较它们并计算匹配的元素。 这是我的代码: 在这里比较过程要花费很多时间。 如何解决和优化此问题。 问题答案: 您应该使用:返回一个包含collection1中所有元素的集合,这些元素也处于collection2中。

  • 我有两个格式为m/d/yyyy的字符串日期。例如“2012年11/1”、“2013年1/2”。我正在用JavaScript编写一个函数来比较两个字符串日期。我的函数的签名是如果string1传递的日期晚于string2传递的日期,则返回true,否则返回false。因此,isLater(“1/2/2013”,“11/1/2012”)应返回true。我如何为此编写一个JavaScript函数?

  • 问题内容: 我正在尝试比较两个日期,而我只想比较日期部分而不是时间部分,这就是我在程序中存储日期的方式: 我有一个: 我想用 但是由于还涉及时间部分,所以我无法获得正确的答案。我该如何解决我的问题? 我不想使用JODA-TIME 问题答案: 您可以像这样逐个比较价值 要么 如果您使用Date类,请考虑改用Calendar类这是最优雅的解决方案,为此使用Calendar和Comparator 用法:

  • 问题内容: Java中两个double值的简单比较会产生一些问题。让我们考虑以下Java中的简单代码段。 上面的代码似乎返回,表达式的求值,但是没有。它之所以返回,是因为该表达式的求值实际上是预期的因此不等于,因此条件的求值为。解决这种情况的最佳建议方法是什么? 问题答案: 基本上,你不应该进行精确比较,而应该执行以下操作: