我在下一个
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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。