绑定ObservableObject数组的元素:不建议使用'subscript(_ :)'

时间:2019-08-02 10:18:57

标签: swift swiftui xcode11

我正在使用ObservableObject'DataStore',其中包含对象('exampleObject')的数组('exampleList')。

@Published exampleList = [exampleObject]()

我正在通过@EnvironmentObject('dataStore')调用DataStore。

@EnvironmentObject var dataStore = DataStore()

然后我用

遍历列表
ForEach(0..<dataStore.exampleList.count) { index in ....

要将item的元素绑定到详细信息视图,我正在这样做:

DetailView(itemBinding: $dataStore.exampleList[index])

在Xcode11 beta 4之前,它运行良好。

自XCode11 beta 5起,它仍然可以工作,但是Xcode给我此警报:

  

'subscript(_ :)'已过时:有关迁移路径,请参见发行说明

我尝试了一些简单的东西,使用了一个简单的@State var,它包含一个字符串数组,这是同样的问题:调用此数组的元素并尝试将其值用于TextField时:

TextField("test", text: $test[0])

我收到相同的警报。

我不知道如何解决它。这是否意味着我们不再可以在数组内部绑定值? 然后,我们如何迭代数组并绑定特定项目?

这是我关于Stackoverflow的第一个问题,对于我的问题很笨拙,我深表歉意... 非常感谢您的回答,我使用Stackoverflow已有多年了,这真是太神奇了,我总是能找到现有的有用的答案,但这是我第一次找不到任何答案,这就是我要问的原因。

1 个答案:

答案 0 :(得分:10)

Xcode 11,beta 6更新:

好消息!就像我怀疑的那样,在beta 6中,与Binding的{​​{1}}一致性已被其他替换。现在,它不再符合MutableCollection,而是让您通过MutableCollection访问元素。结果是您现在可以继续执行@dynamicMemberLookup而不再收到警告!看来这个问题现在可以解决了。

Xcode 11(测试版5)。旧答案:

我终于有一些时间对此进行调查。正如我在评论中提到的那样,我认为等待$text[3]一致性完全消除(或用其他替换)是明智的。但是,为了满足我们的好奇心,我在Collection上创建了一个扩展,我认为它可以完成当前Binding的一致性。唯一的区别是,我没有通过下标进行访问,而是实现了一个名为Collection的函数来为元素添加element(_ idx: Int)

如果有一天完全删除了一致性,我可以更改实现并亲自遵守Binding<T>。我现在不能这样做,因为它会与现有的(和不建议使用的)实现冲突。就目前而言,我认为这演示了如果您绝对想摆脱警告,那么如何处理警告。

请明确。我没有使用此代码。只要我仍然可以通过下标访问元素,我仍然会这样做并忽略警告。这只是出于学术目的。

扩展名是:

Collection

它可以像这样使用:

extension Binding where Value: MutableCollection, Value.Index == Int {
    func element(_ idx: Int) -> Binding<Value.Element> {
        return Binding<Value.Element>(
            get: {
                return self.wrappedValue[idx]
        }, set: { (value: Value.Element) -> () in
            self.wrappedValue[idx] = value
        })
    }
}