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" 下标,完全避免下标。
两期:
你不需要使用items[safe: index]
,因为items.indices
只给你有效的索引。您永远不会有超出数组边界的索引。
你不能使用items[safe: index]
,因为self.$service.items是一个Binding<[Item]>
,它是不是集合,因此您对集合的扩展不适用。
只需删除 safe:
即可。
有关详细信息,请参阅 的末尾。
我们有在访问集合中的任何元素时使用安全下标的做法。下面是我们的扩展。
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" 下标,完全避免下标。
两期:
你不需要使用
items[safe: index]
,因为items.indices
只给你有效的索引。您永远不会有超出数组边界的索引。你不能使用
items[safe: index]
,因为self.$service.items是一个Binding<[Item]>
,它是不是集合,因此您对集合的扩展不适用。
只需删除 safe:
即可。
有关详细信息,请参阅