Joe*_*oey 0 arrays swift option-type
如何在可选中声明 [Int]
我尝试
var listofNumber = [Int]?()
Run Code Online (Sandbox Code Playgroud)
但这不起作用
但如果我尝试
var listofNumber : [Int]?
Run Code Online (Sandbox Code Playgroud)
问题是我不能再使用 listofNumber.append
“[Int]”类型的值?没有成员“追加”
你正在写,[Int]?但这只是语法糖。
在幕后,您实际声明的是Optional<[Int]>.
如果您查看 的文档Optional<T>,您可以看到为此值类型声明了三个初始值设定项:
init(from: Decoder) throws这个与 Swift 4 中引入的编码协议结合使用。这里与此无关。init(nilLiteral: ())这会初始化Optional<T>to nil。init(some: T)这会初始化Optional<T>to T。您的语句var listOfNumbers = [Int]?()与任何初始化程序都不匹配,因此不起作用。
现在你可能想要做的 - 以及我们大多数人可能会在这里做的 - 是:
\n\nvar listOfNumbers: [Int]? = []
listOfNumbers这声明了to be的类型[Int]?(又名Optional<[Int]>),同时将其初始值设置为空数组。
这里需要注意的关键一点是,几乎所有这些都是语法糖。如果你特意“本地”定义了 var,它看起来会像这样:
\n\nvar listOfNumbers = Optional<[Int]>(Array<Int>())。
(您可以省略泛型参数Array,因为这里的类型系统会推断出它。)
由于这写起来很麻烦而且读起来也不太好,所以你可以使用简短的版本。
\n\n至于关于Array.append.\n您的 var 类型的第二个问题[Int]?(又名Optional<[Int]>),因此您无法访问变量或调用该Array类型上定义的方法。您需要先打开可选的包装。
listOfNumbers?.append(4711)。
如果您使用 Xcode,它实际上应该为您提供此类问题的修复程序。
\n\n无论如何,既然我们正在谈论“明确性”:
\n\nlistOfNumbers?.append(4711)又是语法糖的一个闪亮例子。
明确地写出来,它看起来像这样:
\n\n// Optional<T> is actually an enum, so we can switch over it.\nswitch listOfNumbers {\ncase .some(var value):\n value.append(4711)\ncase .none:\n break\n}\n\n// Alternative\nif case .some(var value) = listOfNumbers {\n value.append(4711)\n}\nRun Code Online (Sandbox Code Playgroud)\n\n正如您所看到的,这很快就会变得臃肿,特别是考虑到可选链等。因此,简短的版本被“发明”了。
\n\n我写了这么长的答案,是为了让您清楚地了解幕后发生的事情,我想提醒自己有时构建的具体细节总是没有坏处的。
\n\n请注意,这样写语句对您来说是完全有效的:
\n\nvar listOfNumbers = [Int]?([])
\也不
\nvar listOfNumbers = [Int]?(nilLiteral: ())
您使用的语法糖的数量由您决定,您可以根据需要将其与“显式”编码混合。
\n| 归档时间: |
|
| 查看次数: |
717 次 |
| 最近记录: |