關於Swift中的泛函式find的問題

流火行者發表於2015-03-26

對於一個陣列Array,我們往往需要判斷其是否包含某個子項,又或者要查詢某個子項是否在這個陣列中。

假設有這樣一個包含座標的陣列

1    var pointArray:[CGPoint] = [CGPoint(x: 2,y: 3),CGPoint(x: 4,y: 5),CGPoint(x: 2,y: 7),CGPoint(x: 3,y: 8),CGPoint(x: 2,y: 9),CGPoint(x: 0,y: 3)]

如何判斷該陣列是否包含某個點,這個點的X座標為3呢?

var a = contains(pointArray, {$0.x == 3})

contains就是一個謂詞函式,$0表示複用的陣列元素,這個是swift的約定

contains只能返回是否包含該子項,不能返回該子項,如果需要返回該子項所在的索引用find函式

比如查詢(4,5)這個點在陣列中的索引序號

var index = find(pointArray, CGPoint(x:4,y:5))

執行之後,index = 1

如果你想要查詢上面的X座標為3的點,怎麼查詢?C#裡邊有linq語句,和資料庫查詢類似的語句,無所不能,Swift可沒有這麼強大,

提供的find函式還不支援謂詞的查詢(可能以後會加上)

其實自己寫這個函式也很簡單:

    func findIndex<S : SequenceType, L : BooleanType>(seq: S, predicate: (S.Generator.Element) -> L) -> Int?{

        for (index,element) in enumerate(seq){

            if predicate(element){

                return index

            }

        }

        return nil

    }

 var  b = findIndex(pointArray, predicate: {$0.x == 3})

相關文章