簡體   English   中英

如何在Swift中為特定類型的數組進行擴展

[英]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()

比如說具體的類型是S.

extension CollectionType where Generator.Element == S {
}

CollectionType協議

我創建了一個懶洋洋的作品對於任何一個擴展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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM