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

Swift/Combine- Assign a filtered object to a property on a class

我有一个对象列表。

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

它存在于存储库中。

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

我有一个 class 和一个需要在初始化时分配的 属性。

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

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

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

问题是我的模式 returns 一个元素数组,我无法使其符合 class 上的单数 属性?最好的解决方法是什么?

我得到的错误本质上是

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

由于 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] = [=10=] }
}

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