這裏的問題是區分具有==
運算符的東西,而不是某些「可相等」的東西。
兩個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
但他們自己不符合Equatable
。這是有道理的,因爲你可以在它們內部放置一個不相等的類型。但結果是,如果一個數組包含一個不可分類的類型,那麼==
將不起作用。因爲可選項不是Equatable
,所以在數組中放入可選項時就是這種情況。
你會得到同樣的事情,如果你想比較數組的數組:
let a = [[1,2]]
let b = [[1,2]]
a == b // error: `==` can’t be applied to `[Array<Int>]`
如果你想特殊的情況下,你可以寫==
爲自選的陣列爲:
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
需要其內容是哈希的(並因此equatable),它可以是 equatable:
let setarray: [Set<Int>] = [[1,2,3],[4,5,6]]
setarray == [[1,2,3],[4,5,6]] // true
Int?不是可以是'nil'的Int,它是可選的,當不是'nil'時可以是Int。那麼,Int和Int?是不能比較的不同類型。 – sasquatch 2015-03-03 11:22:11
我也在幾個月前提交了Swift的幾個bug,也沒有反饋。我做了一個計算,蘋果每天獲得大約9500個有關雷達的bug報告。所以他們可能會工作(高)... – 2015-03-03 11:27:38
@sasquatch你說的是真實的,但不是真正的根本原因。這裏沒有非選擇權,問題是缺乏可選擇的可選項。 – 2015-03-03 11:38:07