关于Swift中的泛函数find的问题

对于一个数组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})