【问题标题】:How to get self of parent in @propertyWrapper?如何在@propertyWrapper 中获取父母的自我?
【发布时间】:2019-10-06 07:21:09
【问题描述】:

我想仅在事件之间经过指定间隔后处理更改的@Published someVar。如何在propertyWrapper 中获取selfSomeClass

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 = ""
}

【问题讨论】:

    标签: swift swiftui combine


    【解决方案1】:

    我在另一个论坛得到了以下答案

    正式?你不能。

    非正式的?您可以使用下划线下标 - check out this test 在 swift repo 中 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()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-24
      • 1970-01-01
      • 1970-01-01
      • 2021-03-31
      • 2021-11-09
      • 1970-01-01
      • 2010-12-16
      • 2011-01-13
      相关资源
      最近更新 更多