SwiftUI:绑定数组的安全下标

时间:2019-09-24 14:10:37

标签: swift swiftui combine

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

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

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

  

下标中的传递参数标签'safe:'

下面是有问题的代码

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")
                }
            }
        }
    }
}

2 个答案:

答案 0 :(得分:4)

两个问题:

  1. 您不需要使用items[safe: index],因为items.indices仅为您提供有效的索引。您将永远不会拥有超出数组范围的索引。

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

只需移除safe:,您就可以开始使用

有关更多详细信息,请参见this answer的结尾。

答案 1 :(得分:1)

诊断消息令人困惑,但是问题是您的下标返回一个可选内容,但是您将其视为非可选内容。您将不得不处理返回nil的情况。

我个人认为这种方法正在与系统对抗。使用ForEach(service.items)会更好。完全避免下标,而不是“安全”下标。