Arrays 如何在可选语言中声明[Int]
如何在可选语言中声明[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
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
的文档,您可以看到为该值类型声明了三个初始化器:
此选项与Swift 4中引入的编码协议结合使用。这与此无关init(from:Decoder)抛出
此命令将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。知道吗?这是因为您的打印。永远不要使用!运算符