You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 05:32:36