![](/img/trans.png)
[英]How can I cast an NSMutableArray to a Swift array of a specific type?
[英]How can I make a extension for array of specific type in Swift
比方說我有:
struct S {
var num = 0
}
我想實現一個函數allEqual()作為Array<S>
擴展,所以我可以這樣做
var s1 = S()
var s2 = S()
var s3 = S()
var equality = [s1,s2,s3].allEqual()
我創建了一個懶洋洋的作品對於任何一個擴展SequenceType
,其Element
s為Equatable
。 在Swift中,優良作法是使代碼完全按照它可以工作的方式工作:為了能夠得到所有元素是否相等,它必須是一系列相等的值。 這是代碼:
extension SequenceType where Generator.Element : Equatable {
var allEqual : Bool {
var gen = generate() // Generate the sequence for the first element
return gen.next().map { fst in // Get first element and map it (when existing)
!contains { fst != $0 } // To whether self doesn't contain any elements unequal to first
} ?? true // When first is nil, return true
}
}
或者你也可以做更多的迭代(基本上
我認為更快?
):
extension SequenceType where Generator.Element : Equatable {
var allEqual : Bool {
var gen = generate()
let first = gen.next()
return !contains { $0 != first }
}
}
您還應該使您的結構符合Equatable
協議,如下所示:
func ==(lhs: S, rhs: S) -> Bool {
return lhs.x == rhs.x
}
因為每個值類型都應該是等同的 ,顯然在代碼中完全有意義。
這是一些測試代碼:
[S(x: 3), S(x: 3), S(x: 3)].allEqual // true
[S(x: 5), S(x: 3), S(x: 3)].allEqual // false
[S(x: 5), S(x: 5)].allEqual // true
[S(x: 0)].allEqual // true
[S]().allEqual // true
請注意,它是惰性的,這意味着只要有一個不等於第一個元素的元素,它就會返回false,所以如果你有這樣的東西:
let longList = [S(x: 5)] + [S](count: 100000, repeatedValue: S(x: 4))
// [{x 5}, {x 4}, {x 4}, {x 4}, {x 4}, {x 4}, {x 4}, ...
longList.allEqual // false
將返回第二個元素,因為已經存在相等性
編輯:我以前的功能不必要地復雜。 新的仍然懶得更短
在最新的Swift 3.1中。 您可以對具體類型擴展執行相同類型的約束 。 所以在你的情況下,你可以這樣做:
extension Array where Element == S {
func allEqual() -> Bool {
...
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.