swift - 无法使用类型为 '[xxx]' 的索引下标类型为 '(Int, () -> ())' 的值

标签 swift indexing subscript

我有这个问题,访问数组索引时出错。索引应该是一个整数,但它不起作用。我最初尝试使用一个变量,但在这个例子中我将它更改为整数 0,只是为了显示它不是问题所在的变量。

   let location = SNStore.Welland[index].locations[0] {
                    if location.timestamp > 0 {

                    }
                }

错误是:

 Cannot subscript a value of type '[LocationStore]' with an index of type '(Int, () -> ())'

那么有人可以解释为什么数组不需要 int 作为其索引吗?这很奇怪,我不明白。

我检查了快速帮助中的位置声明,它正确地显示了位置是如何在结构中声明的。 (在结构中,它的末尾有花括号以将其初始化为空。)

var locations: [LocationStore]

最佳答案

Swift 中的下标是通过调用一个特殊的方法 subscript 在幕后完成的,该方法接受一个 Int。所以当你写:

locations[0]

Swift 实际上是在用 [] 中的值调用 subscript 函数:

locations.subscript(0)

您不能直接调用 subscript,但它就在那里,您可以通过为它们实现 subscript 来为您自己的类定义自定义下标。

您将 Swift 与 locations[0] 之后的额外花括号 { } 混淆了。 Swift 将 { } 及其内容解释为带有签名 () -> () 的闭包(不接受输入,不返回输出)。由于 trailing 闭包语法,Swift 然后将该闭包解释为 subscript 函数的第二个参数,该函数在 locations 上调用以执行索引。这个下标函数接受一个参数,一个 Int,但是您传递了两个参数,一个 Int() -> () 闭包。这就是错误消息告诉您的内容。

修复方法是删除多余的 { }:

let location = SNStore.Welland[index].locations[0]
if location.timestamp > 0 {
    // do something
}

关于swift - 无法使用类型为 '[xxx]' 的索引下标类型为 '(Int, () -> ())' 的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53619368/

相关文章:

ios - 如何在 PrepareForSegue 中显示 ActivityIndi​​cator?

sql-server - SQL Server : multi-column index

HTML <sup/> 标签影响行高,如何保持一致?

ios - 在 uisearchbar 中手动插入文本

ios - 如何将 UIView 固定在 iOS 11 NavigationBar 不断变化的高度框架下方?

python - 为什么这段代码在某些情况下会引发 IndexError?

c++ - 我收到一个错误 [错误 : expected unqualified-id before ‘&’ token ] in a c++ program

swift - Swift 字典如何用于存储通用对象 [T : C<T>]?

iphone - 如何通过数组索引将图像从 coreData 加载到 UIImage 中

使用mongodb C驱动创建索引