苹果公司的文件如下:
您可以一起使用if和let来处理可能丢失的值。这些值表示为可选项。可选值要么包含值,要么包含nil,表示该值缺失。在值的类型后面写一个问号(?),将该值标记为可选值。
为什么要使用可选值?
苹果公司的文件如下:
您可以一起使用if和let来处理可能丢失的值。这些值表示为可选项。可选值要么包含值,要么包含nil,表示该值缺失。在值的类型后面写一个问号(?),将该值标记为可选值。
为什么要使用可选值?
当前回答
可选值允许您显示没有值。有点像SQL中的NULL或Objective-C中的NSNull。我想这将是一个改进,因为您甚至可以将其用于“原始”类型。
// Reimplement the Swift standard library's optional type
enum OptionalValue<T> {
case None
case Some(T)
}
var possibleInteger: OptionalValue<Int> = .None
possibleInteger = .Some(100)”
摘自:苹果公司《快速编程语言》。“iBooks。https://itun.es/gb/jEUH0.l
其他回答
嗯…
? (可选)表示您的变量可能包含nil值,而!(unwrapper)表示在运行时使用变量(试图从中获取值)时,变量必须具有内存(或值)。
主要的区别是,当可选对象为nil时,可选链接会优雅地失败,而当可选对象为nil时,强制展开会触发一个运行时错误。
为了反映可选链接可以在nil值上调用的事实,可选链接调用的结果总是一个可选值,即使您正在查询的属性、方法或下标返回一个非可选值。你可以使用这个可选的返回值来检查可选的链接调用是否成功(返回的可选值包含一个值),或者由于链中的nil值而不成功(返回的可选值为nil)。
具体来说,可选链接调用的结果与预期返回值的类型相同,但包装在可选类型中。一个属性,通常返回一个Int将返回一个Int?当通过可选链接访问时。
var defaultNil : Int? // declared variable with default nil value
println(defaultNil) >> nil
var canBeNil : Int? = 4
println(canBeNil) >> optional(4)
canBeNil = nil
println(canBeNil) >> nil
println(canBeNil!) >> // Here nil optional variable is being unwrapped using ! mark (symbol), that will show runtime error. Because a nil optional is being tried to get value using unwrapper
var canNotBeNil : Int! = 4
print(canNotBeNil) >> 4
var cantBeNil : Int = 4
cantBeNil = nil // can't do this as it's not optional and show a compile time error
以下是苹果开发者委员会提供的基本教程:可选链接
在Swift中,你不能有一个指向nil的变量——既没有指针,也没有空指针。但是在一个API中,你经常希望能够指出一个特定类型的值,或者一个缺乏值的值——例如,我的窗口是否有一个委托,如果有,它是谁?可选的是Swift的类型安全,内存安全的方式来做到这一点。
我做了一个简短的回答,总结了上面的大部分内容,以清除我作为初学者脑海中的不确定性:
与Objective-C相反,在Swift中没有变量可以包含nil,所以增加了Optional变量类型(变量以"?"结尾):
var aString = nil //error
最大的区别是可选变量不直接存储值(像普通的Obj-C变量一样),它们包含两种状态:“有值”或“有nil”:
var aString: String? = "Hello, World!"
aString = nil //correct, now it contains the state "has nil"
也就是说,你可以在不同的情况下检查这些变量:
if let myString = aString? {
println(myString)
}
else {
println("It's nil") // this will print in our case
}
通过使用"!"后缀,您还可以访问包含在其中的值,前提是这些值存在。(即它不是nil):
let aString: String? = "Hello, World!"
// var anotherString: String = aString //error
var anotherString: String = aString!
println(anotherString) //it will print "Hello, World!"
这就是为什么您需要使用“?”和“!”,而不是默认情况下全部使用它们。(这是我最大的困惑)
我也同意上面的回答:可选类型不能用作布尔类型。
让我们以NSError为例,如果没有返回错误,你会想让返回Nil是可选的。如果没有错误,给它赋值是没有意义的。
var error: NSError? = nil
这也允许您拥有一个默认值。因此,如果函数没有传递任何东西,你可以为方法设置一个默认值
func doesntEnterNumber(x: Int? = 5) -> Bool {
if (x == 5){
return true
} else {
return false
}
}
在Swift中,可选类型既可以有值,也可以没有值。可选选项是通过附加?对任何类型:
var name: String?
您可以参考这个链接来深入了解:https://medium.com/@agoiabeladeyemi/ opoptions -in-swift-2b141f12f870