函数式编程之 filter

我们先来看需求。从指定的数组中过滤出符合条件的元素,我们先来看简单的情形:

1
2
3
4
5
6
7
8
9
10
11
let exampleFiles = ["README.md", "HelloWorld.swift", "FlappyBird.swift"]

func getSwiftFiles(files: [String]) -> [String] {
var result: [String] = []
for file in files {
if file.hasSuffix(".swift") {
result.append(file)
}
}
return result
}

与上一篇博客的思路一样,我们来封装变化点,首先是过滤的逻辑,其次是类型信息,最后将其放在 Array 的 extension 中:

1
2
3
4
5
6
7
8
9
extension Array {
func filter(includeElement: Element -> Bool) -> [Element] {
var result: [Element] = []
for x in self where includeElement(x) {
result.append(x)
}
return result
}
}

代码的思路非常清晰,于是我们可以像下面一样使用 filter 方法:

1
[1, 2, 3].filter{ $0 > 2}

当然,Swift 标准库中提供了 filter 的实现,定义在 SequenceType 协议中。这里我们只是来自己实现一次。

参考资料 objc Functional Swift

如果这篇文章帮助您解决了问题,可以考虑请我喝杯咖啡