gpt4 book ai didi

Swift 奇怪的 '==' 行为与字典

转载 作者:搜寻专家 更新时间:2023-11-01 06:07:25 25 4
gpt4 key购买 nike

在 Swift 2.1 中,可以编译以下代码。

let a = [1: [1]]
a == [1: [1]]

但是,下面的代码无法编译。

let a = [1: [1]]
let b = [1: [1]]
a == b // => binary operator '==' cannot be applied to two '[Int : Array<Int>]' operands

如何理解这种行为?

最佳答案

有一个==运算符比较两个 Swift 字典,但是它要求值类型为 Equatable :

public func ==<Key : Equatable, Value : Equatable>(lhs: [Key : Value], rhs: [Key : Value]) -> Bool

问题是即使对于可等值类型 T , Array<T> 不符合 Equatable协议(protocol)。参见示例 Why can't I make Array conform to Equatable?进行讨论在 Apple 开发者论坛中。

这就是为什么

let a = [1: [1]]
let b = [1: [1]]
a == b // => binary operator '==' cannot be applied to two '[Int : Array<Int>]' operands

不编译。在你的第一个例子中

let a = [1: [1]]
a == [1: [1]]

编译器很聪明,可以取文字数组[1]作为 NSArray文字,使用

extension NSArray : ArrayLiteralConvertible {
/// Create an instance initialized with `elements`.
required public convenience init(arrayLiteral elements: AnyObject...)
}

这会编译,因为所有类都继承自 NSObject符合 Equatable .

这是一个演示相同问题的更简单的示例:

func foo<T : Equatable>(x : T) {
print(x.dynamicType)
}

let ar = [1, 2, 3]
// This does not compile:
foo(ar) // error: cannot invoke 'foo' with an argument list of type '([Int])'

foo([1, 2, 3]) // Output: __NSArrayI

如你所见,literal 数组被转换为 NSArray传递给期望 Equatable 的函数时的类簇争论。

另请注意,如果您只导入 Swift,而不导入 Foundation(或 UIKit,...),则两者都不会

foo([1, 2, 3])

您的第一个示例也无法编译。

关于Swift 奇怪的 '==' 行为与字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33730653/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com