在 Swift 中,filter 是一个常用的高阶函数,适用于集合类型(如数组、字典等)。它的作用是筛选出满足指定条件的元素,返回一个新的集合。
用法
let filteredArray = originalArray.filter { condition }
originalArray 是一个集合(如数组)。
condition 是一个闭包,返回 true 的元素会被保留,返回 false 的元素会被过滤掉。
适用范围
1、数组 (Array)
2、字典 (Dictionary)
3、集合 (Set)
示例
1、对数组使用 filter
let numbers = [1, 2, 3, 4, 5, 6]
// 筛选偶数
let evenNumbers = numbers.filter { $0 % 2 == 0 }
print(evenNumbers) // [2, 4, 6]
$0 是闭包的简写,表示数组的当前元素。
$0 % 2 == 0 是筛选条件,表示数字是偶数。
2、对字符串数组使用 filter
let names = ["Alice", "Bob", "Charlie", "David"]
// 筛选长度大于3的名字
let longNames = names.filter { $0.count > 3 }
print(longNames) // ["Alice", "Charlie", "David"]
条件 $0.count > 3 检查名字长度是否大于 3。
3、对字典使用 filter
let scores = ["Alice": 85, "Bob": 70, "Charlie": 95]
// 筛选分数大于80的学生
let highScorers = scores.filter { $0.value > 80 }
print(highScorers) // ["Alice": 85, "Charlie": 95]
$0.key 表示键(学生名字),$0.value 表示值(分数)。
结果是一个新的字典,只保留符合条件的键值对。
4、对集合使用 filter
let numbers: Set = [1, 2, 3, 4, 5]
// 筛选大于3的数字
let greaterThanThree = numbers.filter { $0 > 3 }
print(greaterThanThree) // [4, 5]
结果是一个数组。
filter 的常见应用
1、筛选满足条件的数据
let files = ["image.png", "document.pdf", "video.mp4"]
let images = files.filter { $0.hasSuffix(".png") }
print(images) // ["image.png"]
2、从复杂数据结构中筛选
struct User {
let name: String
let isActive: Bool
}
let users = [
User(name: "Alice", isActive: true),
User(name: "Bob", isActive: false),
User(name: "Charlie", isActive: true)
]
let activeUsers = users.filter { $0.isActive }
print(activeUsers.map { $0.name }) // ["Alice", "Charlie"]
filter 和 compactMap 的区别
filter: 只用于筛选出满足条件的元素,不改变元素的类型。
compactMap: 不仅筛选,还会剔除 nil,并对元素进行转换。
例如:
let numbers = ["1", "2", "three", "4"]
let validNumbers = numbers.compactMap { Int($0) }
print(validNumbers) // [1, 2, 4]
filter 不会剔除无法转换的 nil 值,而 compactMap 会。
总结
filter 是一个强大的工具,用于根据条件筛选集合中的元素。
它保持集合类型不变,但元素的数量可能会减少。
与其他高阶函数(如 map 和 compactMap)搭配使用可以极大提高代码简洁性和可读性。