我一直在努力研究一些带有JSON数据的项目,我遇到了一个问题,当我声明我的数组someArray: [Int]?
时,打印的数据都是nils。但是,当我更改为someArray:[Int] = [Int]()
时,JSON数据中的所有数据都会附加到数组中。
你们中的任何人都可以告诉我为什么会发生类似这样的事情,除了可选项之外,前后版本之间的区别是什么?
答案 0 :(得分:4)
someArray: [Int]?
只是一个声明而不是初始化。 ?
符号表示它是一个可选值,可以是nil。
someArray: [Int] = [Int]()
是一个声明和初始化,因此您可以获得附加的值。
你也可以在像这样的单独行上做到这一点
someArray: [Int]?
someArray = [Int]()
答案 1 :(得分:2)
除了可选项中的一个之外,前者和后一版本之间的区别是什么?
没有其他区别,但重要的是所有差异。
我想当你尝试[Int]?
时,你的代码看起来像这样:
class myObject {
var someArray: [Int]?
func add(_ x: Int) {
someArray?.append(x)
}
}
然后当您致电add(x)
并在之后检查someArray
时,someArray
仍为零。 ?
中的someArray?.append(x)
称为“可选链接”,它表示“如果someArray
为零,则不执行任何操作。否则,请致电someArray!.append(x)
“。由于您从未将someArray
设置为非零,因此它始终无效。
然后我猜你尝试过这样的事情:
class myObject {
var someArray: [Int] = [Int]()
func add(_ x: Int) {
someArray.append(x)
}
}
在这种情况下,someArray
不是可选的。它被初始化为一个空数组。它可以是Int
的任何数组,但它永远不会为零。由于它不是可选的,因此没有可选的链接,因此此处?
中没有someArray.append(x)
。
如果要使用可选数组,则需要在某个时刻将其设置为非零。也许这就是你想要的:
class myObject {
var someArray: [Int]?
func add(_ x: Int) {
if someArray == nil { someArray = [] }
someArray!.append(x)
}
}
答案 2 :(得分:0)
Swift拥有自己的功能,可选值就是其中之一。一旦声明变量或常量说
var sampleVariable: [Int]?
您要做的是创建一个变量来初始化或为其分配内存。 附加值或为变量赋值后,它可以在内存中存在。 确保在使用可选变量之前使用if阻塞
同样适用于
var sampleVariable = [Int]()
此处您已分配已分配和初始化的变量。它永远不会是零。 您可以继续为其分配附加值。