Combine 中 @Published 浅析
@Published的wrappedValue
你是否跟我一样有这样的困惑,为什么这个property wrapper中没有看到wrappedValue,要实现一个property wrapper这不是必须的吗?
再来回顾一下State,同样的property wrapper,实现了wrappedValue
如果你把上面的Published再Xcode中自己实现,是会提示错误没有写wrappedValue实现的,所以说明系统的实现内部写了,但是为什么看不到?
唯一的可能是,wrappedValue的访问级别为internal,也就是说其实@Published的实际实现声明了类似于interval var wrappedValue:Value的内容,这满足了property wrapper的要求。
但是设计者不想暴露出来给外部使用,所以标记为internal,使其wrappedValue在框架之外是不可见的。
@Published的使用
既然wrappedValue不想暴露出来被外部使用,意图就是让使用projectedValue,它的类型是Published<Value>.Publisher,
Publisher是一个在@Published属性包装器内部的嵌套结构体类型,同时也遵守Publisher协议
这样的设计使得标记为@Published的属性投影($)都可以assign或sink订阅处理,使用各种Operator,如下面代码示例
创造Publisher的常见方式
定义一个struct
添加需要从外部传入的参数作为存储属性
添加一个计算属性publisher,遵循AnyPublisher<Output, Failure>,具体Output和Failure类型根据业务需要设计
使用初始化结构体,调用publisher,返回遵循Publisher协议对象,视情况后续Operator操作
版权声明: 本文为 InfoQ 作者【kingnight_pig】的原创文章。
原文链接:【http://xie.infoq.cn/article/f689aaa0c1b8eb372c872ffe7】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论