Arrays 如何在可选语言中声明[Int]

Arrays 如何在可选语言中声明[Int],arrays,swift,optional,Arrays,Swift,Optional,如何在可选语言中声明[Int] 我试着 var listofNumber = [Int]?() 但它不起作用 但是如果我尝试 var listofNumber : [Int]? 问题是我不能再使用listofNumber.append了 “[Int]?”类型的值没有成员“append”用于声明使用以下语法: var listOfNumber: [Int]? = [] 然后使用您需要的任何方法: listOfNumber?.append(20) listOfNumber?.insert(40

如何在可选语言中声明[Int]

我试着

var listofNumber = [Int]?()
但它不起作用

但是如果我尝试

var listofNumber : [Int]?
问题是我不能再使用listofNumber.append了


“[Int]?”类型的值没有成员“append”

用于声明使用以下语法:

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!)
}

var-listofNumber:[Int]?
是一种很好的方法

不要忘记使用
init


var listofNumber:[Int]?=[]
变量列表编号:[Int]?=无


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

您正在编写
[Int]?
,但这只是语法糖

在幕后,您实际声明的是
可选的

如果查看
Optional
的文档,您可以看到为该值类型声明了三个初始化器:

  • init(from:Decoder)抛出
    此选项与Swift 4中引入的编码协议结合使用。这与此无关
  • init(nilLiteral:())
    此命令将
    可选项初始化为
    nil
  • init(some:T)
    此选项将
    可选项初始化为
    T
您的语句
var listOfNumbers=[Int]?()
与任何初始值设定项都不匹配,因此无法工作

现在你可能想做的是——我们大多数人在这里大概会做的是:


var listofNumber:[Int]?=[]

这将
列表编号
的类型声明为
[Int]?
(也称为
可选
),同时将其初始值设置为空数组

这里需要注意的关键是,几乎所有这些都是语法上的糖分。如果您特意将var定义为“本机的”,它将如下所示:

// 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)
}
var listOfNumbers=可选(数组())

(您可以省略
数组
的泛型参数,因为这里的类型系统会推断出该参数。)

由于编写起来很麻烦,而且读起来也不太好,所以可以使用短版本

关于
数组.append的第二个问题。
您的var类型为
[Int]?
(又称
可选
),因此您无法访问
数组
类型上定义的var或调用方法。您需要先打开可选的

listofNumber?.append(4711)

如果您使用的是Xcode,它实际上应该为您提供一个解决此类问题的方法

既然我们说的是“明确性”:

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)
}
//Optional实际上是一个枚举,所以我们可以切换它。
开关编号列表{
案例部分(var值):
附加值(4711)
案例:无:
打破
}
//另类
如果case.some(var值)=列表编号{
附加值(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)
}
var-listofNumber=[Int]?([])


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


您使用的语法糖量取决于您自己,您可以随意将其与“显式”编码混合使用。

要声明int类型的可选数组,请使用以下命令:
var listOfNumber:[int]?
将声明它,但不初始化它。当您需要使用它时,您需要这样做:
listOfNumber=[Int]()
您是在尝试创建一个可选的
Int
s数组,还是一个可选的
Int
s数组?可能是
var listOfNumber:[Int]?=[Int]()
变量列表编号:[Int?]=[Int]()
变量列表编号:[Int?][Int]()
,这取决于您在这里要达到的目标。
var listofNumber:[Int]?=[Int]()
变量列表编号:[Int]?=[]
在实践中[T]?在语义上很少与和空[T]不同,所以除非nil真的表示与空不同的内容,否则不应该使用它。if(listOfNumber?[0]==nil){print(“if access”)listOfNumber?.append(20)print(listOfNumber!)。我犯了一个致命的错误:在打开可选值时意外地发现了nil请看我答案的第二部分!请忘记上面的问题,我的意思是我的。附加似乎不影响号码列表。使用此if(listOfNumber?[0]==nil){print(“if-access”)//如果访问是print-listOfNumber?.append(Number2)。//不工作??print(listOfNumber)//仍然是print-nil,但为什么?}使用其他结构:“if-listOfNumber!=nil{…}”或“如果是数字!”!。count>0{…}if(listOfNumber?[0]==nil){print(“if access”)listOfNumber?.append(20)print(listOfNumber!)。我遇到了一个致命错误:在展开可选值时意外发现nil。知道吗?这是因为您的打印。永远不要使用!运算符