我有一个带有发布名称属性的模型:
@MainActor class MyModel:ObservableObject {
@Published private(set) var name = ""
....
}
我想知道为什么sink在model.$name
上使用时可以工作,而在model.name.publisher
上不可以。
model.$name
.receive(on: RunLoop.main)
.sink { name in
.... <-- it's called. works.
}
.store(in: &subs)
这不会被称为:
model.name.publisher
.receive(on: RunLoop.main)
.sink { name in
.... <-- does not get called.
}
.store(in: &subs)
有人能解释一下为什么我必须在name前面使用$
符号,为什么name.publisher
不起作用吗?
2条答案
按热度按时间yhived7q1#
$name
是您存取@Published
属性 Package 函数之基础Publisher
的方式。每次name
属性变异时,这个出版者都会发出,而这可能正是您想要的。使用
model.name.publisher
,您会得到一个Publisher
,它将发出String
的每个字符,然后完成(它在Sequence
扩展上定义)如果您有:您将看到
f - o - o
ryevplcw2#
在这个特殊的情况下,我明白为什么它的困惑。
$name
引用@Published
属性 Package 中的发布者。这就是您所需要的。name.publisher
是String中的一个元素。Fabio Felici的答案很好地解释了它。它将循环遍历当前字符串的字符(返回String.Element
),而不是在换出字符串时的新值。为此,使用$name
。(在sink
上,每次更改都返回一个String
类型。)