someArray有什么区别:[Int]? vs someArray:[Int] = [Int]()

时间:2018-01-19 04:53:14

标签: arrays swift

我一直在努力研究一些带有JSON数据的项目,我遇到了一个问题,当我声明我的数组someArray: [Int]?时,打印的数据都是nils。但是,当我更改为someArray:[Int] = [Int]()时,JSON数据中的所有数据都会附加到数组中。

你们中的任何人都可以告诉我为什么会发生类似这样的事情,除了可选项之外,前后版本之间的区别是什么?

3 个答案:

答案 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]()

此处您已分配已分配和初始化的变量。它永远不会是零。 您可以继续为其分配附加值。