SwiftUI:绑定数组的安全下标

SwiftUI: Safe subscript for binding array

我们有在访问集合中的任何元素时使用安全下标的做法。下面是我们的扩展。

extension Collection {
    subscript(safe index: Index) -> Element? {
        return indices.contains(index) ? self[index] : nil
    }
}

但是当我尝试将它与绑定对象一起使用时,它给我一个错误提示

Extraneous argument label 'safe:' in subscript

下面是有问题的代码

struct MyView: View {
    @ObservedObject var service: service

    var body: some View {
        List {
            ForEach(service.items.indices) { index in
                Toggle(isOn: self.$service.items[safe: index]?.isOn ?? false) {  // Error: Extraneous argument label 'safe:' in subscript
                    Text("isOn")
                }
            }
        }
    }
}

诊断消息令人困惑,但问题是您的下标 returns 是可选的,但您将其视为非可选的。您将不得不处理 returns nil.

的情况

个人认为这种做法是在对抗系统。你最好使用 ForEach(service.items)。而不是 "safe" 下标,完全避免下标。

两期:

  1. 你不需要使用items[safe: index],因为items.indices只给你有效的索引。您永远不会有超出数组边界的索引。

  2. 你不能使用items[safe: index],因为self.$service.items是一个Binding<[Item]>,它是不是集合,因此您对集合的扩展不适用。

只需删除 safe: 即可。

有关详细信息,请参阅 的末尾。