仅在事件之间经过指定的间隔后,我才想处理更改的@Published someVar
。如何在self
中获得SomeClass
中的propertyWrapper
?
private var cancellableSet: Set<AnyCancellable> = []
extension Published where Value: Equatable {
init<S>(
wrappedValue defaultValue: Value,
for dueTime: S.SchedulerTimeType.Stride,
scheduler: S,
sink: @escaping (Value) -> () ) where S: Scheduler {
self.init(initialValue: defaultValue)
projectedValue
.debounce(for: dueTime, scheduler: scheduler)
.removeDuplicates()
.sink(receiveValue: sink)
.store(in: &cancellableSet)
}
}
class SomeClass {
@Published(
for: 0.5,
scheduler: RunLoop.main,
sink: { val in
// how to get self of SomeClass
print(self.someVar2) //Error: Value of type '(SomeClass) -> () -> SomeClass' has no member 'someVar2'
})
var someVar = ""
var someVar2 = ""
}
答案 0 :(得分:0)
我在另一个论坛上得到了以下答案
正式吗?你不能。
非正式地?您可以使用带下划线的下标-check out this test 在快速回购29中
下划线的东西不是官方的,没有保证,可以 随时删除。
我未使用underscored subscript
private var cancellableSet: [String: AnyCancellable] = [:]
extension Published where Value: Equatable {
init(wrappedValue defaultValue: Value) {
self.init(initialValue: defaultValue)
}
mutating func Observe<S>(
key: String,
for dueTime: S.SchedulerTimeType.Stride,
scheduler: S,
sink: @escaping (Value) -> () ) where S: Scheduler {
print(key)
if cancellableSet[key] == nil {
cancellableSet[key] =
self.projectedValue
.debounce(for: 0.5, scheduler: RunLoop.main)
.removeDuplicates()
.sink(receiveValue: sink)
}
}
}
class SomeClass {
@Published
var someVar = "" {
willSet {
_someVar.Observe(key: #function, for: 0.5, scheduler: RunLoop.main) { val in
print(val)
}
}
}
var someVar2 = ""
func test() {
someVar = "a"
someVar = "ab"
someVar = "abc"
}
}
SomeClass().test()