加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

比较两个选项数组的Swift错误

发布时间:2020-12-14 04:45:30 所属栏目:百科 来源:网络整理
导读:我在下一个 Swift代码中遇到了编译错误 var x:ArrayInt? = [1,2]var y:ArrayInt? = [1,2]if x == y { // Error} 如果两个数组都是Array Int它工作正常,但如果它们中至少有一个是可选的,它会抛出类似下一个错误: Binary operator ‘==’ cannot be applied t
我在下一个 Swift代码中遇到了编译错误

var x:Array<Int?> = [1,2]
var y:Array<Int?> = [1,2]
if x == y {  // Error
}

如果两个数组都是Array< Int>它工作正常,但如果它们中至少有一个是可选的,它会抛出类似下一个错误:

Binary operator ‘==’ cannot be applied to two Array<Int?> operands

几个月前我提交了一份错误报告,但我没有回答.它仍然出现在Swift 1.2中.

为什么会这样?

解决方法

这里的问题是具有==运算符的东西与“等于”的东西之间的区别.

Optional和Array都有一个==运算符,当它们包含的是等号时,它可以工作:

// if T is equatable,you can compare each entry for equality
func ==<T : Equatable>(lhs: [T],rhs: [T]) -> Bool
// if T is equatable,you can compare the contents,if any,for equality
func ==<T : Equatable>(lhs: T?,rhs: T?) -> Bool

let i: Int? = 1
let j: Int = 1
i == j          // fine,Int is Equatable
["a","b"] == ["a","b"]  // and so is String

但他们自己并不符合Equatable.这是有道理的,因为你可以在其中放置一个非等同类型.但结果是,如果一个数组包含一个非等号类型,那么==将无效.由于选项不是Equatable,因此当您将可选项放入数组时就是这种情况.

如果你试图比较一组数组,你会得到同样的东西:

let a = [[1,2]]
let b = [[1,2]]
a == b  // error: `==` can’t be applied to `[Array<Int>]`

如果您想要特殊情况,可以将== for optionals数组写为:

func ==<T: Equatable>(lhs: [T?],rhs: [T?]) -> Bool {
    if lhs.count != rhs.count { return false }
    for (l,r) in zip(lhs,rhs) {
        if l != r { return false }
    }
    return true
}

对于一个反例,由于Set要求其内容是可清洗的(因此是等同的),它可以是等同的:

let setarray: [Set<Int>] = [[1,2,3],[4,5,6]]
setarray == [[1,6]]  // true

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读