我们有一种在访问集合中的任何元素时使用安全下标的做法。以下是我们的扩展名。
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")
}
}
}
}
}
答案 0 :(得分:4)
两个问题:
您不需要使用items[safe: index]
,因为items.indices
仅为您提供有效的索引。您将永远不会拥有超出数组范围的索引。
您不能使用items[safe: index]
,因为self。$ service.items是Binding<[Item]>
,它不是Collection,因此您对Collection的扩展不适用。
只需移除safe:
,您就可以开始使用
有关更多详细信息,请参见this answer的结尾。
答案 1 :(得分:1)
诊断消息令人困惑,但是问题是您的下标返回一个可选内容,但是您将其视为非可选内容。您将不得不处理返回nil的情况。
我个人认为这种方法正在与系统对抗。使用ForEach(service.items)
会更好。完全避免下标,而不是“安全”下标。