Switf的可选类型(optional)类型,用于处理值缺失的情况。可选表示”那儿有一个值,并且它等于 x 或者 “那儿没有值”。Swift语言定义后缀 ?作为命名可选类型的简写,以下两种声明是可等的:
var optionalInteger: Int ?
var optionalInteger: Optional<Int>
在这两种情况下,变量optionalInteger都是可选类型。注意,在类型和?之间没有空格。Optional是一个包含两种情况的枚举,None 和 some(T),用来表示可能有或者可能没有值。任何类型都可以明确声明为(或者隐式转换)可选类型。当声明一个可选类型的时候。要确保用括号给 ? 操作符一个合适的范围。例如,声明可选整数数组,应该写成 (Int[])?,写成 Int[]? 会报错。当你声明一个可选变量或者可选属性的时候没有提供初始值,它的值默认为 nil。可选项遵照LogicValue协议,因此可以出现在布尔环境中。在这种情况下,如果可选类型为 T?包含类型为T的任何值(也就是说它的值时 Optional.Some(T)),这个可选类型等于 true,反之为false.如果一个可选类型的实例包含一个值,你可以用后缀操作符!来访问这个值,如下所示:
optionalInteger = 42
optionalInteger ! // 42
使用操作符 !去获取值为nil的可选变量会有运行错误。你可以用可选链接和可选绑定选择性执行可选表达式操作。如果值为nil,任何操作都不行,也不会有运行报错。
var myString:String?
myString = "hello world"
if myString != nil {
print(myString!)
} else {
print("字符串为 nil")
}
以上结果为:
hello world
可选类型类似于OC中的指针的nil值,但nil只对类(calss)有用,而对可选类型对所有的类型都可用,并且更安全。
强制解析
当你确定可选类型确实包含值之后,你可以在可选的名字后面加一个感叹(!)来获取值,这个感叹号表示"我知道这个可选有值,请使用它。"这被称为可选值的强制解析(forced unwrapping)
var myString:String?
myString = "hello swift"
if myString != nil {
print(myString)
} else {
print("myString 值为 nil")
}
执行结果为
Optional("hello swift")
强制解析可选值,使用感叹号(!):
var myString:String?
myString = "hello swift"
if myString != nil {
print(myString!)
} else {
print("myString 值为 nil")
}
输出结果为:
hello swift
注意:使用 ! 来获取一个不存在的可选值会导致运行时错误。使用 ! 来强制解析值之前,一定要确定可选包含一个非nil的值。
可选绑定
使用optional binding来判断optional类型是否有值,并且如果有值就把值赋给一个常量或者临时变量。
optional binding可以用在 if 和 while 语句中:
if let constantName = someOptional {
print("get the value: \(constantName)")
}
//如果someOptional这个optional类型有值,创建一个叫做constantName的常量并将someOptional包含的值赋给它。
//并且因为constantName已经被optional类型包含的值初始化过,所以不需要再使用 ! 后缀来获取它的值。
var myString:String?
myString = "hello swift!"
if let yourString = myString {
print("你的字符串是:\(yourString)")
} else {
print("你的字符串没有值")
}
网友评论