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 绑定

如何将 SwiftUI 视图绑定到数组中元素的属性

SwiftUI 中 MVVM 模式中多个切换的绑定变量数组

SwiftUI - 删除绑定数组中的元素会导致错误

SwiftUI - 将 ForEach 与不符合可识别/可散列的绑定数组一起使用

可选字符串数组作为绑定参数 SwiftUI [重复]