【问题标题】:Extension for default empty value for optional publisher?可选发布者的默认空值扩展?
【发布时间】:2020-06-14 13:03:53
【问题描述】:

我正在尝试将可选发布者传递给我的视图的.onReceive。我不想像这样强制包装它:

let refreshPublisher: AnyPublisher<Void, Never>?

var body: some View {
    Group {
        ...
    }
    .onReceive(refreshPublisher!) {...}
}

所以我传递了一个空的默认值,如下所示:

var body: some View {
    Group {
        ...
    }
    .onReceive(refreshPublisher ?? Empty<Void, Never>().eraseToAnyPublisher()) {...}
}

这真的很冗长,想在 Optional 发布者上添加一个扩展,如下所示:

extension Optional where Wrapped == Publisher { // Incorrect syntax, doesn't compile
    func orEmpty() -> AnyPublisher<Void, Never> { ... }
}

这样,我可以结束或者做这样的事情:

var body: some View {
    Group {
        ...
    }
    .onReceive(refreshPublisher.orEmpty()) {...}
}

在非可选链中处理可选发布者是否有可能或更好的方法?

【问题讨论】:

    标签: swift combine


    【解决方案1】:

    对于您的具体问题,这当然是可能的。我只是不会这样做。

    注意在Publisher 之前添加Combine.。有一种名为 Optional.Publisher 的类型会影响 Combine.Publisher,这就是导致您的错误的原因。

    extension Optional where Wrapped: Combine.Publisher {
        func orEmpty() -> AnyPublisher<Wrapped.Output, Wrapped.Failure> {
            self?.eraseToAnyPublisher() ?? Empty().eraseToAnyPublisher()
        }
    }
    

    我不会这样做,而是将默认值设为 Empty 并且根本不使用 Optional:

    let refreshPublisher: AnyPublisher<Void, Never>
    
    init(refreshPublisher: AnyPublisher<Void, Never> = Empty().eraseToAnyPublisher()) {
        self.refreshPublisher = refreshPublisher
    }
    

    我也会重新设计这个,以便调用者可以传递他们想要的任何发布者,而不是强制他们使用AnyPublisher

    let refreshPublisher: AnyPublisher<Void, Never>
    
    init<Refresh>(refreshPublisher: Refresh) where Refresh: Publisher,
        Refresh.Output == Void, Refresh.Failure == Never {
            self.refreshPublisher = refreshPublisher.eraseToAnyPublisher()
    }
    
    init() {
        self.init(refreshPublisher: Empty())
    }
    

    【讨论】:

      猜你喜欢
      • 2017-06-03
      • 2014-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多