Swiftui 这是将属性标识为'@出版';

Swiftui 这是将属性标识为'@出版';,swiftui,combine,protocol-extension,Swiftui,Combine,Protocol Extension,我想为集合中的对象建立一个绑定,这样我就可以像引用指针一样向下游传递它。我希望这是一个方便的功能,但我有一些麻烦 我可以对以下协议“Diskable”施加什么约束(如果有的话)来消除下面的错误 final class PropertiesData: ObservableObject, Diskable { @Published var fetchedItems: [Property] = [] var location: URL { l

我想为集合中的对象建立一个绑定,这样我就可以像引用指针一样向下游传递它。我希望这是一个方便的功能,但我有一些麻烦

我可以对以下协议“Diskable”施加什么约束(如果有的话)来消除下面的错误

final class PropertiesData: ObservableObject, Diskable {
    
    @Published var fetchedItems: [Property] = []
        
    var location: URL {
        let file = try! LocalStorage.rootFolder.createFileIfNeeded(withName: "properties.data")
        return file.url
    }
}

extension Diskable where T: Identifiable {
    
    func binding(for object: T) -> Binding<T> {
        let index = fetchedItems.firstIndex(where: { $0.id == object.id } )!
        return $fetchedItems[index] // cannot find 'fetchedItems' in scope
    }
}

protocol Diskable: AnyObject {
    associatedtype T: Codable
    var location: URL { get }
    var fetchedItems: [T] { get set }
}
最终类属性数据:可观察对象,可磁盘{
@已发布的变量fetchedItems:[属性]=[]
变量位置:URL{
让file=try!LocalStorage.rootFolder.createFileIfRequired(使用名称:“properties.data”)
返回file.url
}
}
可扩展磁盘,其中T:可识别{
func绑定(对于对象:T)->绑定{
让index=fetchedItems.firstIndex(其中:{$0.id==object.id})!
return$fetchedItems[index]//在作用域中找不到'fetchedItems'
}
}
协议可盘:AnyObject{
关联类型T:可编码
变量位置:URL{get}
var fetchedItems:[T]{get set}
}

据我所知,这里有一个解决方案(使用Xcode 12.1/iOS 14.1进行测试)

可扩展磁盘,其中T:可识别{
func绑定(对于对象:T)->绑定{
让index=fetchedItems.firstIndex(其中:{$0.id==object.id})!
返回绑定(
获取:{self.fetchedItems[index]},
集合:{self.fetchedItems[index]=$0}
)
}
}
extension Diskable where T: Identifiable {
    func binding(for object: T) -> Binding<T> {
        let index = fetchedItems.firstIndex(where: { $0.id == object.id } )!
        return Binding(
            get: { self.fetchedItems[index] },
            set: { self.fetchedItems[index] = $0 }
        )
    }
}