当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Swift Optional.Publisher assign(to:)用法及代码示例


实例方法

assign(to:)

通过将元素分配给标记为发布者的属性,重新发布从发布者接收到的元素。

声明

func assign(to published: inout Published<Self.Output>.Publisher)
FailureNever 时可用。

参数

published

@Published 属性标记的属性,它接收和重新发布从上游发布者接收到的所有元素。

详述

当您想要从发布者接收元素并通过标有 @Published 属性的属性重新发布它们时,请使用此运算符。 assign(to:) 运算符管理订阅的生命周期,在 Published 实例取消初始化时自动取消订阅。因此,assign(to:) 运算符不会像 assign(to:on:) 那样返回您负责的 AnyCancellable

下面的示例显示了一个模型类,它从内部 Timer.TimerPublisher 接收元素,并将它们分配给名为 lastUpdated@Published 属性。因为to参数有inout关键字,调用该方法时需要使用&运算符。


class MyModel: ObservableObject {
    @Published var lastUpdated: Date = Date()
    init() {
         Timer.publish(every: 1.0, on: .main, in: .common)
             .autoconnect()
             .assign(to: &$lastUpdated)
    }
}

如果您改为使用 assign(to: lastUpdated, on: self) 实现 MyModel ,则存储返回的 AnyCancellable 实例可能会导致引用循环,因为 Subscribers/Assign 订阅者将持有对 self 的强引用。使用assign(to:) 解决了这个问题。

虽然 to 参数使用 inout 关键字,但此方法不会替换传递给它的引用类型。相反,此符号表示操作符可以修改分配对象的成员,如下例所示:


    class MyModel2: ObservableObject {
        @Published var id: Int = 0
    }
    let model2 = MyModel2()
    Just(100).assign(to: &model2.$id)

可用版本

iOS 14.0+, iPadOS 14.0+, macOS 11.0+, Mac Catalyst 14.0+, tvOS 14.0+, watchOS 7.0+

相关用法


注:本文由纯净天空筛选整理自apple.com大神的英文原创作品 Optional.Publisher assign(to:)。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。