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

嵌套数组上的Swift相等运算符

羊慈
2023-03-14
问题内容

为什么最后一个语句无法编译为错误:Binary operator '==' cannot be applied to two '[[Simple]]’ operands,并且有一种方法可以修改Simple结构或扩展==运算符以对嵌套数组(或字典)执行相等性检查?

var i1: [Int] = [1]
var i2: [Int] = [1]
i1 == i2 // -> true


var i3: [[Int]] = [[1], [2]]
var i4: [[Int]] = [[1], [2]]
i3 == i4 // -> true


struct Simple: Equatable, Hashable {
    let message: String

    var hashValue: Int {
        return message.hashValue
    }
}
func ==(lhs: Simple, rhs: Simple) -> Bool {
    return lhs.message == rhs.message
}

var a: [Simple] = [Simple(message: "a")]
var b: [Simple] = [Simple(message: "a")]
a == b // -> true

var x: [[Simple]] = [[Simple(message: "a")], [Simple(message: "b")]]
var y: [[Simple]] = [[Simple(message: "a")], [Simple(message: "b")]]
x == y // -> ERROR! Binary operator '==' cannot be applied to two '[[Simple]]’ operands

问题答案:

更新: 条件一致性已在 Swift 4.1中 实现 特别是:

现在,标准库类型Optional,Array和Dictionary的元素类型符合Equatable时,它们便符合Equatable协议。…

(来自Swift
CHANGELOG)。

现在可以任意嵌套Equatable元素数组,Equatable并且可以与进行比较==。您的密码

var x: [[Simple]] = [[Simple(message: "a")], [Simple(message: "b")]]
var y: [[Simple]] = [[Simple(message: "a")], [Simple(message: "b")]]
x == y

如果Simple为,则在Xcode 9.3中编译Equatable

(旧答案:)
其原因与为什么未为可选数组定义Equatable相似。如果元素类型为,则可以 数组进行 比较
==``Equatable

/// Returns true if these arrays contain the same elements.
public func ==<Element : Equatable>(lhs: [Element], rhs: [Element]) -> Bool

这就是为什么

var a: [Simple] = [Simple(message: "a")]
var b: [Simple] = [Simple(message: "a")]
a == b // -> true

编译。

但即使是equatable类型TArray<T> 不符合
Equatable协议,比较为什么我不能做阵列符合Equatable?。因此,在

var x: [[Simple]] = [[Simple(message: "a")], [Simple(message: "b")]]
var y: [[Simple]] = [[Simple(message: "a")], [Simple(message: "b")]]
x == y // -> ERROR! Binary operator '==' cannot be applied to two '[[Simple]]’ operands

xy与元素类型阵列[Simple],其不会 符合Equatable协议,并且不存在匹配的==运算符。

您可以==为简单的嵌套数组定义通用运算符,如下所示:

func ==<Element : Equatable> (lhs: [[Element]], rhs: [[Element]]) -> Bool {
    return lhs.count == rhs.count && !zip(lhs, rhs).contains {$0 != $1 }
}

或更简单(如@kennytm所建议):

func ==<Element : Equatable> (lhs: [[Element]], rhs: [[Element]]) -> Bool {
    return lhs.elementsEqual(rhs, by: ==)
}

这样可以进行x == y编译并按预期工作。目前,似乎没有办法==在任意嵌套的数组上定义运算符。



 类似资料:
  • 问题内容: 我想将以下内容转换为运算符。 我写得像下面。 但是发现它不能正常工作,这不是正确的方法吗? 问题答案: 在PHP中,三元运算符是棘手的事情,因为它们是左关联的(不同于所有其他语言都是右关联的)。在这种情况下,您将需要使用括号告诉PHP您到底想要什么:

  • 我对这个结果很困惑。 是不同的对象,当处理时,它会比较第一个元素的地址,所以 的行为。 (*)是否等于 ? 是一个对象吗?和都指向这个物体的第一个元素?

  • shell脚本中的,有什么区别? 以下两者有什么区别吗? 仅仅是 和 仅在变量包含数字时才使用吗?

  • 问题内容: 我有一个从数据库(JSON MySQL中的数据存储)检索数据的程序。 我设法得到对象。输出为: JSON对象: 我需要有关如何处理数据并将信息放入不同数组/对象的建议。例如 谢谢。 问题答案: 您可以使用Jackson Api来实现。 您必须创建与json对象相同的Pojo类(该类应具有“ attributes”,“ uuid”之类的成员)。 这是您必须使用的类 和代码 现在,您可以使

  • 问题内容: 我一直在尝试使用嵌套形式,如下所示: 但似乎我缺少了一些东西。谁能协助我该怎么做? 问题答案: 将其括在括号中: 甚至更好的是,使用适当的/ 语句(出于可维护性): 但是,正如其他人指出的那样:使用起来更简单:

  • 我试图查询与特定用户至少有一种共同颜色的所有用户,我已经能够做到这一点,但是我无法弄清楚如何我的结果,以便我可以得到一个用户以及他们共有的颜色。 我的示例用户文档的一部分如下: 这是我的查询,用于获取与另一个具有红色、橙色和绿色的用户相同的颜色: 如何使用共同的颜色聚合用户?