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
相关产品推荐
相关产品推荐

