Swift中是可以声明一个没有初始值的属性, Swift中引入了可选类型(Optional)来解决这一问题。它的定义是通过在类型声明后加一个 ? 操作符完成的。
例如: var name: String?
Optional其实是个enum,里面有None和Some两种类型。其实所谓的nil就是Optional.None , 非nil就是Optional.Some, 然后会通过Some(T)包装(wrap)原始值,这也是为什么在使用Optional的时候要拆包(从enum里取出来原始值)的原因。这里是enum Optional的定义
enum Optional<T> : LogicValue, Reflectable {
case None
case Some(T)
init()
init(_ some: T)
/// Allow use in a Boolean context.
func getLogicValue() -> Bool
/// Haskell's fmap, which was mis-named
func map<U>(f: (T) -> U) -> U?
func getMirror() -> Mirror
}
? 和 ! 使用
一旦声明为Optional的,如果不显式的赋值就会有个默认值nil。判断一个Optional的值是否有值,可以用if来判断:
if name {
// 有值再操作
}
在使用Optional值的时候需要在具体的操作,比如调用方法、属性、下标索引等前面需要加上一个?,如果是nil值,也就是Optional.None,会跳过后面的操作不执行,如果有值,就是Optional.Some,可能就会拆包(unwrap),然后对拆包后的值执行后面的操作,来保证执行这个操作的安全性。
? 的使用场景:
1.声明Optional值变量
2.用在对Optional值操作中,用来判断是否能响应后面的操作
3.使用 as? 向下转型
下面声明一个对象Person为可选类型,或者一个可选的String
var person:Person?
var str:String?
var num:NSNumber!
可选类型 可以不用初始化,如果不是可选类型,必须在init下进行初始化。保证在调用的时候不是nil
可选类型在调用的时候必须加上?或者!,声明的时候用的!的可以不加
let str:String! = "Hello"
let greeting = "World!"
if str != nil {
let message = str + " " + greeting
print(message)
}
声明的时候用的?需要加上!
let str:String? = "Hello"
let greeting = "World!"
if str != nil {
let message = str! + " " + greeting
print(message)
}
??是取两个中不为nil的
let helloStr:String? = nil
let x = helloStr ?? "Hello World!"
print(x)
网友评论