Swift高阶函数filter
Swift高阶函数filter

Swift高阶函数filter

在 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)搭配使用可以极大提高代码简洁性和可读性。

如果您认为这篇文章给您带来了帮助,您可以在此通过支付宝或者微信打赏网站开放者。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注