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

Swift Combine PassthroughSubject出现UnsafeMutablePointer警告如何解决?

问题原因
  • 核心原因是Combine中sink方法的闭包参数顺序写反了。sink的双参数重载的第一个参数是receiveCompletion闭包(接收完成事件,类型为Subscribers.Completion<Failure>),第二个参数才是receiveValue闭包(接收上游发送的正常值,这里是Bool类型)。
  • 你当前把值处理逻辑写在了第一个参数的位置,导致类型不匹配,编译器无法正确解析参数类型,进而触发了Playground的UnsafeMutablePointer相关异常警告。
  • 额外错误:你直接打印self.flag时输出的是CurrentValueSubject实例本身,而非它存储的实际值,需要访问value属性才能拿到正确的布尔值。
修复方案

方案1:保留完成事件监听,调整闭包顺序

import Combine

var flag = CurrentValueSubject<Bool, Never>(false)
var flagChange = PassthroughSubject<Bool, Never>()
var subscriptions = Set<AnyCancellable>()

init() {
    flagChange.sink { [unowned self] completion in
        // 此处处理完成事件,参数为完成状态枚举
        print("完成事件触发 \(completion)")
        print("当前flag值 \(self.flag.value)")
    } receiveValue: { [unowned self] value in
        print("收到值 \(value)")
        self.flag.send(value)
    }.store(in: &subscriptions)
}

方案2:不需要监听完成事件,直接用单参数重载

如果你不需要处理上游的完成回调,可以直接用仅带receiveValue参数的sink简化代码:

init() {
    flagChange.sink { [unowned self] value in
        print("收到值 \(value)")
        self.flag.send(value)
        print("当前flag值 \(self.flag.value)")
    }.store(in: &subscriptions)
}

优化建议

实际项目中建议将unowned self替换为weak self,避免实例提前释放时触发野指针崩溃:

flagChange.sink { [weak self] value in
    guard let self = self else { return }
    print("收到值 \(value)")
    self.flag.send(value)
    print("当前flag值 \(self.flag.value)")
}.store(in: &subscriptions)

内容的提问来源于stack exchange,提问作者user2924482

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 18:18:02