如何在可选中声明[Int]

时间:2017-11-21 10:44:44

标签: arrays swift optional

如何在可选

中声明[Int]

我试试

var listofNumber = [Int]?()

但它不起作用

但如果我尝试

var listofNumber : [Int]?

问题是我不能再使用listofNumber.append

'[Int]类型的值?'没有成员'追加'

3 个答案:

答案 0 :(得分:3)

你正在写[Int]?,但这只是语法糖。

在幕后,你实际宣称的是Optional<[Int]>

如果查看Optional<T>的文档,可以看到为此值类型声明了三个初始化程序:

  • init(from: Decoder) throws这个与Swift 4中引入的编码协议一起使用。这里没有任何意义。
  • init(nilLiteral: ())此处将Optional<T>初始化为nil
  • init(some: T)此处将Optional<T>初始化为T

您的陈述var listOfNumbers = [Int]?()与任何初始订阅者都不匹配,因此无效。

现在您可能想做的事情 - 以及我们大多数人可能会在这里做的事情 - 是:

var listOfNumbers: [Int]? = []

这将listOfNumbers的类型声明为[Int]?(又名Optional<[Int]>),同时将其初始值设置为空数组。

这里要注意的关键是,几乎所有这些都是语法糖。如果你不按自己的方式定义var&#34;本地&#34;,它看起来像这样:

var listOfNumbers = Optional<[Int]>(Array<Int>())

您可以将通用参数省略到Array,因为这将由类型系统推断。

由于编写起来很麻烦,而且阅读效果不好,所以可以使用短版本。

关于Array.append的第二个问题。 您的var的类型为[Int]?(又名Optional<[Int]>),因此您无法访问Array类型上定义的变量或调用方法。您需要首先打开可选项。

listOfNumbers?.append(4711)

如果您正在使用Xcode,它实际上应该为您提供针对此类问题的修复方法。

现在我们谈论&#34;显性&#34;无论如何:

listOfNumbers?.append(4711)再次成为语法糖的光辉榜样。

明确地写,它看起来像这样:

// Optional<T> is actually an enum, so we can switch over it.
switch listOfNumbers {
case .some(var value):
  value.append(4711)
case .none:
  break
}

// Alternative
if case .some(var value) = listOfNumbers {
  value.append(4711)
}

正如你所看到的,这很快就会变得臃肿,特别是考虑到可选的链接等等。因此,短版本被发明了&#34;。

我已经写了这么久的答案,以便让你清楚地了解幕后的情况,我想你自己有时会提醒你自己的基本要素。

更新

请注意,编写如下语句完全有效:

var listOfNumbers = [Int]?([])

var listOfNumbers = [Int]?(nilLiteral: ())

你使用它的语法糖量,你可以将它与&#34;明确的&#34;混合使用。但是你需要编码。

答案 1 :(得分:2)

声明使用此语法:

var listOfNumber: [Int]? = []

然后使用您需要的任何方法:

listOfNumber?.append(20)
listOfNumber?.insert(40, atIndex: 1)

listOfNumber!                               // result: [20,40]

第二部分。

这是你的代码:

if listOfNumber?[0] == nil {
    print("if access...")
} else { 
    listOfNumber?.append(20)
    print(listOfNumber!)
}

答案 2 :(得分:1)

var listofNumber : [Int]?是最好的方法。

别忘了init使用

var listofNumber : [Int]? = []var listofNumber : [Int]? = nil

之后,由于数组是可选的,请使用listofNumber?.append(10)