- Swift Combine 学习(一):Combine 初印象
- Swift Combine 学习(二):发布者 Publisher
- Swift Combine 学习(三):Subscription和 Subscriber
- Swift Combine 学习(四):操作符 Operator
- Swift Combine 学习(五):Backpressure和 Scheduler
- Swift Combine 学习(六):自定义 Publisher 和 Subscriber
- Swift Combine 学习(七):实践应用场景举例
引言
在前几篇文章中,我们已经了解了 Combine 框架的基本概念、发布者和订阅者的工作机制。本文将详细介绍 Combine 中的操作符(Operator),这些操作符是处理和转换数据流的重要工具。通过学习各类操作符的使用,我们可以更灵活地处理异步事件流,构建复杂的数据处理链条,从而提升应用的响应能力和性能。
操作符 (Operator)
Operator 在 Combine 中用于处理、转换 Publisher 发出的数据。Operator 修改、过滤、组合或以其他方式操作数据流。Combine 提供了大量内置操作符,如:
-
转换操作符:如
map、flatMap和scan,用于改变数据的形式或结构。-
scan:用于对上游发布者发出的值进行累加计算。它接收一个初始值和一个闭包,每次上游发布者发出一个新元素时,scan会根据闭包计算新的累加值,并将累加结果传递给下游。let publisher = [1, 2, 3, 4].publisher publisher .scan(0, { a, b in a+b }) .sink { print($0) } // 1 3 6 10 -
map:用于对上游发布者发出的值进行转换。它接收一个闭包,该闭包将每个从上游发布者接收到的值转换为新的值,然后将这个新值发给下游let nums = [1, 2, 3, 4, 5] let publisher = nums.publisher publisher .map { $0 * 10 } // 将每个数乘以10 .sink { print($0) } // 输出: 10 20 30 40 50 -
flatMap:用于将上游发布者发出的值转换为另一个发布者,并将新的发布者的值传递给下游。与map不同,它可以对发布者进行展平,消除嵌套。import Combine let publisher = [[1, 2, 3], [4, 5, 6]].publisher // 使用 flatMap 将每个数组转换为新的发布者并展平 let cancellable = publisher .flatMap { arr in arr.publisher // 将每个数组转换为一个新的发布者 } .sink { value in print(value) } /* 输出: 1 2 3 4 5 6 */
-
-
过滤操作符:包括
filter、compactMap和removeDuplicates,用于选择性地处理某些数据。let numbers = ["1", "2", nil, "2", "4", "4", "5", "three", "6", "6", "6"] let publisher = numbers.publisher let subscription = publisher // 使用 compactMap 将字符串转换为整数。如果转换失败就过滤掉该元素 .compactMap { $0.flatMap(Int.init) } // filter 过滤掉不符合条件的元素. 如过滤掉小于 3 的数 .filter { $0 >= 3 } // 用 removeDuplicates 移除连续重复的元素 .removeDuplicates() .sink { print($0) } // 输出: 4 5 6 -
组合操作符:如
merge、zip和combineLatest,用于将多个数据流合并成一个。combineLatest:用于将多个发布者的最新值合成一个新的发布者。每当任何一个输入发布者发出新值时,combineLatest操作符会将每个发布者的最新值组合并作为元组向下游发送。merge:用于将多个发布者合并为一个单一的发布者,以不确定性的顺序发出所有输入发布者的值。zip:用于将两个发布者组合成一个新的发布者,该发布者发出包含每个输入发布者的最新值的元组。
let numberPublisher = ["1", "2", nil].publisher.compactMap { Int($0 ?? "") } let letterPublisher = ["A", "B", "C"].publisher let extraNumberPublisher = ["10", "20", "30"].publisher.compactMap { Int($0) } // 使用 merge 合并 numberPublisher 和 extraNumberPublisher print("Merge Example:") let

:操作符 Operator&spm=1001.2101.3001.5002&articleId=144837633&d=1&t=3&u=a9728ff6598b4cfd919d0985d955507f)
2555

被折叠的 条评论
为什么被折叠?



