如何在可选
中声明[Int]我试试
var listofNumber = [Int]?()
但它不起作用
但如果我尝试
var listofNumber : [Int]?
问题是我不能再使用listofNumber.append
了'[Int]类型的值?'没有成员'追加'
答案 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)
。