如何用Combine监听Swift中@Published布尔属性的切换?
仅在Bool状态切换时触发Combine响应
你可以用Combine的removeDuplicates()操作符实现这个需求。默认情况下,@Published属性只要被赋值(哪怕值和当前一致)就会发送事件,removeDuplicates()会自动过滤掉连续重复的值,只在状态真正切换时才传递事件。
示例代码
首先是你的视图模型定义:
import Combine class MyViewModel: ObservableObject { @Published var myBool = false private var cancellables = Set<AnyCancellable>() init() { // 订阅myBool的变化,仅在状态切换时响应 $myBool .removeDuplicates() .sink { [weak self] newValue in // 这里写状态切换后的处理逻辑 print("myBool状态切换为: \(newValue)") } .store(in: &cancellables) } }
验证效果
当你执行以下操作时:
let vm = MyViewModel() vm.myBool = false // 不会触发sink里的逻辑,因为值没变化 vm.myBool = true // 触发响应,打印"myBool状态切换为: true" vm.myBool = true // 不会触发,值重复 vm.myBool = false // 再次触发,打印"myBool状态切换为: false"
关键说明
removeDuplicates()会对比当前发送的值和上一次发送的值,只有当两者不同时才会向下传递。- 要将订阅返回的
AnyCancellable存入集合中,避免订阅被提前销毁。
内容的提问来源于stack exchange,提问作者zumzum
相关产品推荐
相关产品推荐

