Swift 使用联合收割机观察常规值

Swift 使用联合收割机观察常规值,swift,combine,type-constraints,Swift,Combine,Type Constraints,以类型约束类参数为例,包装给定类型的值 参数符合AnyParameter,因此可以在应用程序中的任何位置传递,而不知道类型。参数可以显示在值单元格AnyValueCell 您如何在不必知道基础值类型的情况下观察更改?在value单元格updateObserver函数中避免代码重复会很好 AnyPublisher可以在这里使用吗?如何使用 导入UIKit 进口联合收割机 打印(“你好,游乐场”) 协议任意参数{ var anyValue:Any{get} func集(值:任意) } 协议参数协

以类型约束类
参数
为例,包装给定类型的值

参数符合
AnyParameter
,因此可以在应用程序中的任何位置传递,而不知道类型。参数可以显示在值单元格
AnyValueCell


  • 您如何在不必知道基础值类型的情况下观察更改?在value单元格
    updateObserver
    函数中避免代码重复会很好
  • AnyPublisher
    可以在这里使用吗?如何使用
导入UIKit
进口联合收割机
打印(“你好,游乐场”)
协议任意参数{
var anyValue:Any{get}
func集(值:任意)
}
协议参数协议:AnyParameter{
associatedtype值类型
var值:ValueType{get}
func集合(值:ValueType)
}
公共类参数:ParameterProtocol{
类型别名ValueType=T
@已发布的var值:T
var anyValue:Any{value}
初始值(值:T){
自我价值=价值
}
func集(值:任意){
保护let值=值为?T else{return}
设置(值:值)
}
func集(值:T){
自我价值=价值
}
}
公共类任意值单元{
var参数:AnyParameter{
迪塞特{
updateObserver()
}
}
var观察员:任何可取消的?
init(参数:AnyParameter){
self.parameter=参数
updateObserver()
}
func updateObserver(){
观察员?.cancel()
//这就是问题的关键——如何使其通用?
// ---->
如果设p=参数为?参数{
observer=p.$value.sink(){中的值
打印(“更新单元格->\(值)”)
}
回来
}
如果设p=参数为?参数{
observer=p.$value.sink(){中的值
打印(“更新单元格->\(值)”)
}
回来
}
如果设p=参数为?参数{
observer=p.$value.sink(){中的值
打印(“更新单元格->\(值)”)
}
回来
}

//添加
anyValuePublisher
属性。您可以(也可能应该)将其添加到
AnyParameter
,或者您可以在单独的协议中定义它,如下所示:

protocol AnyParameterPublishing: AnyParameter {
    var anyValuePublisher: AnyPublisher<Any, Never> { get }
}

extension Parameter: AnyParameterPublishing {
    var anyValuePublisher: AnyPublisher<Any, Never> {
        return $value.map { $0 as Any }.eraseToAnyPublisher()
    }
}
class AnyValueCell {
    // ...

    func updateObserver() {
        guard let publishing = (parameter as? AnyParameterPublishing) else {
            print("Wrong param type")
            return
        }
        observer = publishing.anyValuePublisher
            .sink { print("Update Cell -> \($0)") }
    }
}

不。我没有-你是说让
AnyParameter
符合ObserveObject吗?因为单元格是故事中的观察者。我明白了,我的错误。那么它不应该用@ObserveObject包装吗?“在不必知道基础值类型的情况下,如何观察更改?”,好的,但为什么?您想对仅打印的
参数
做什么?让我们来看看。
class AnyValueCell {
    // ...

    func updateObserver() {
        guard let publishing = (parameter as? AnyParameterPublishing) else {
            print("Wrong param type")
            return
        }
        observer = publishing.anyValuePublisher
            .sink { print("Update Cell -> \($0)") }
    }
}