SwiftUI:绑定数组的安全下标
Posted
技术标签:
【中文标题】SwiftUI:绑定数组的安全下标【英文标题】:SwiftUI: Safe subscript for binding array 【发布时间】:2019-09-24 14:10:37 【问题描述】:我们有在访问集合中的任何元素时使用安全下标的做法。下面是我们的扩展。
extension Collection
subscript(safe index: Index) -> Element?
return indices.contains(index) ? self[index] : nil
但是当我尝试将它与绑定对象一起使用时,它给了我一个错误提示
下标中的无关参数标签“安全:”
下面是有问题的代码
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")
【问题讨论】:
如果您知道index
来自item.indices
,为什么还需要“安全下标”?
我假设编译器错误具有误导性,实际问题是您的安全下标返回一个可选。
是的!这是我的疏忽,但即使在链接之后我仍然会遇到同样的错误。我编辑了上面的问题。
【参考方案1】:
两个问题:
您不需要使用items[safe: index]
,因为items.indices
只会为您提供有效的索引。您永远不会有超出数组边界的索引。
你不能使用items[safe: index]
,因为self.$service.items是Binding<[Item]>
,它不是一个集合,所以你对集合的扩展不适用.
只需删除 safe:
即可。
更多详情请参见this answer 的末尾。
【讨论】:
我不同意第 1 点,因为在某些情况下索引无效并且会导致我现在面临的索引越界崩溃,所以必须有办法使用带有绑定数组的安全下标。【参考方案2】:诊断消息令人困惑,但问题是您的下标返回一个可选项,但您将其视为非可选项。你将不得不处理它返回 nil 的情况。
我个人认为这种方法正在与系统作斗争。你最好使用ForEach(service.items)
。而不是“安全”的下标,完全避免使用下标。
【讨论】:
ForEach(service.items) 不幸的是没有工作,我不得不使用索引。 是的!这是我的疏忽,但即使在链接之后我仍然会遇到同样的错误。我编辑了上面的问题。 在这种情况下,您实际上需要使用下标,并且这样做是安全的。看到这个答案:***.com/a/58070916/3088606以上是关于SwiftUI:绑定数组的安全下标的主要内容,如果未能解决你的问题,请参考以下文章
从数组中删除 - 致命错误:索引超出范围 - SwiftUI 绑定