- 概念
1.1可选项:定义形式
var surveyAnswer: String?
上面定义了一个变量surveyAnswer,它表示一个可选项变量,即声明了一个值为nil的变量。还可以直接赋值,如下:
var surveyAnswer: String? = "Yeah"
(注意:Swift 中的 nil 和Objective-C 中的 nil 不同,在 Objective-C 中 nil 是一个指向不存在对象的指针。在 Swift中, nil 不是指针,他是值缺失的一种特殊类型,任何类型的可选项都可以设置成 nil 而不仅仅是对象类型。非可选项的变量是不能设置为nil)
可选项的取值形式有两种:强制展开和可选项绑定
//强制展开
//一旦你确定可选中包含值,你可以在可选的名字后面加一个感叹号 ( ! ) 来获取值,感叹号的意思就是说“我知道这个可选项里边有值,展开吧。”这就是所谓的可选值的强制展开
if convertedNumber != nil {
print("convertedNumber has an integer value of \(convertedNumber!).")
}
//可选项绑定,如果包含就把值赋给一个临时的常量或者变量
if let actualNumber = Int(possibleNumber) {
print("\'\(possibleNumber)\' has an integer value of \(actualNumber)")
} else {
print("\'\(possibleNumber)\' could not be converted to an integer")
}
1.2 隐式展开可选项
有时在一些程序结构中可选项一旦被设定值之后,就会一直拥有值。在这种情况下,就可以去掉检查的需求,也不必每次访问的时候都进行展开,因为它可以安全的确认每次访问的时候都有一个值。这种类型的可选项被定义为隐式展开可选项,通过在声明的类型后边添加一个叹号( String! )而非问号( String? ) 来书写隐式展开可选项。
隐式展开可选项主要被用在 Swift 类的初始化过程中。
//可选项展开
let possibleString: String? = "An optional string."
let forcedString: String = possibleString! // requires an exclamation mark
//隐式可选项展开
let assumedString: String! = "An implicitly unwrapped optional string."
let implicitString: String = assumedString // no need for an exclamation mark
//注意:如果你在隐式展开可选项没有值的时候还尝试获取值,会导致运行错误。结果和在没有值的普通可选项后面加一个叹号一样。
隐式展开方式
//和可选项一样
if assumedString != nil {
print(assumedString)
}
//可选项绑定
if let definiteString = assumedString {
print(definiteString)
}
//与可选项区别:展开后面不需要加"!"