我在下一个Swift代码中遇到了编译错误
var x:Array<Int?> = [1,2]
var y:Array<Int?> = [1,2]
if x == y { // Error
}
Run Code Online (Sandbox Code Playgroud)
如果两个数组都Array<Int>可以正常工作,但如果它们中至少有一个是可选的,则会抛出类似下一个的错误:
二元运算符'=='不能应用于两个
Array<Int?>操作数
几个月前我提交了一份错误报告,但我没有回答.它仍然出现在Swift 1.2中.
为什么会这样?
这里的问题是具有==运算符的东西与"等于"的东西之间的区别.
双方Optional并Array有一个==运营商,当它们包含的内容是equatable工作:
// 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
Run Code Online (Sandbox Code Playgroud)
但他们自己不符合Equatable.这是有道理的,因为你可以在其中放置一个非等同类型.但结果是,如果一个数组包含一个非等号类型,那么==就无法工作.而且由于选项不是Equatable,所以当你在数组中放置一个可选项时就是这种情况.
如果你试图比较一组数组,你会得到同样的东西:
let a = [[1,2]]
let b = [[1,2]]
a == b // error: `==` can’t be applied to `[Array<Int>]`
Run Code Online (Sandbox Code Playgroud)
如果您想要特殊情况,可以==为选项数组编写:
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
}
Run Code Online (Sandbox Code Playgroud)
对于一个反例,由于Set要求其内容可以清洗(因此是等同的),它可以是等同的:
let setarray: [Set<Int>] = [[1,2,3],[4,5,6]]
setarray == [[1,2,3],[4,5,6]] // true
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1594 次 |
| 最近记录: |