Swift/Combine - 将过滤后的对象分配给类的属性

Posted

技术标签:

【中文标题】Swift/Combine - 将过滤后的对象分配给类的属性【英文标题】:Swift/Combine- Assign a filtered object to a property on a class 【发布时间】:2020-07-06 21:41:00 【问题描述】:

我有一个对象列表。

let arr = [[1, 2, 3, 4, 5]]

它存在于存储库中。

class ArrayRepository: ObservableObject  
     @Published let arr = [1,2,3,4,5]
 

我有一个类,其属性需要在初始化时分配。

class MyClass: ObservableObject  
    var id: String = ""
    var myProperty: Int? 

我的类是通过一个异步进程创建的,该进程本身就是一个存储库。

class myClassRepository  
   
    func buildClass -> MyClass  
        myClassInstance = MyClass()
        self.arrayRepository.$arr.map  arr in 
            arr.filter $0 == someOther.Value 
        .assign(to: \.myProperty, on: myClassInstance).store(in: &subscriptions)
       return myClassInstance
    
 

问题是我的模式返回了一个元素数组,我无法使其符合类的奇异属性?最好的方法是什么?

我得到的错误本质上是

Declared closure result '[Int]' is incompatible with contextual type 'Int??'

【问题讨论】:

【参考方案1】:

由于 Swift 类型系统的限制,您目前不能将 assign 设置为具有非 Optional 值的 Optional 属性。但是,您可以创建自己的 assign 版本:

func assign<Root: AnyObject>(to path: ReferenceWritableKeyPath<Root, Output?>, on root: Root) -> AnyCancellable 
    sink  [weak root] in root?[keyPath: path] = $0 

此实现还具有防止引用循环的好处。

【讨论】:

啊,明白了。感谢您的提示!

以上是关于Swift/Combine - 将过滤后的对象分配给类的属性的主要内容,如果未能解决你的问题,请参考以下文章

Swift Combine Pipeline 比较草稿模型

Xcode 11 中 Swift Combine.framework 的可选链接

如何在 Swift Combine 中创建自定义链?

Swift Combine:如何将 `AnyPublisher<[Foo], *>` 转换为 `AnyPublisher<Foo, *>`?

Swift Combine:如何从发布者列表中创建单个发布者?

过滤后如何将分配的属性保留给查询集对象?备择方案?