swift 可选类型详解 (optionals)

可选类型(optionals)来处理值可能缺失的情况 。

解释说明:对于从oc转swift的同学来讲,其实swift可选是比较容易理解的,可选类型其实对应oc的nil类型比较类似。oc的nil只是针对对象来说的。但是swift的可选类型(?)则是对结构体,枚举,c语言类型,并且对象(个人以为是swift里边的所有数据类型)。

直观表示废话不说直接上代码:(代码源于swift2.0 中文翻译)

var serverResponseCode: Int? = 404
// serverResponseCode 包含一个可选的 Int 值 404

serverResponseCode = nil
// serverResponseCode 现在不包含值 


serverResponseCode的类型是 Int? 可选类型,意思是这个变量是既可以是Int类型的变量也可以是nil,因此下方可以看到这个变量可以给nil值。之所以我会这么说明的意思是:如果这个变量如果不声明为optionals类型,是不可以赋值为nil的!大家不信的话可以亲自试一试

接下来揭开可选的几种类型:

(1)强制解析 :

当你确定可选类型确实包含值之后,你可以在可选的名字后面加一个感叹号( )来获取值。这个惊叹号表示“我知道这个可选有值,请使用它。”这被称为可选值的强制解析(forced unwrapping)。如下代码解释说明:

if convertedNumber != nil {
    print("convertedNumber has an integer value of \(convertedNumber!).")

}
// 输出 "convertedNumber has an integer value of 123."
 

这段代码告诉我们,只有可选类型确定真实有值才可以强制用!解析,如果不信,大家可以尝试赋值nil编译器实不会允许你通过的

(2)可选绑定 :

使用可选绑定(optional binding)来判断可选类型是否包含值,如果包含就把值赋给一个临时常量或者变量。可选绑定可以用在 if 和 while 语句中,这条语句不仅可以用来判断可选类型中是否有值,同时可以将可选类型中的值赋给一个常量或者变量。 

if let actualNumber = Int(possibleNumber) {
    print("\'\(possibleNumber)\' has an integer value of \(actualNumber)")
} else {
    print("\'\(possibleNumber)\' could not be converted to an integer")

}

可选绑定于控制流语句紧密结合 let actualNumber = Int(possibleNumber) ,当Int(possibleNumber)为nil的时候这条语句本来是编译不能通过的,当编译不能通过的时候, 这时候进入else分支里

(3)隐式解析可选类型:

这种类型的可选状态被定义为隐式解析可选类型(implicitly unwrapped optionals)。把想要用作可选的类型的后面的问号( String? )改成感叹号( String! )来声明一个隐式解析可选类型。 如下代码:

let possibleString: String? = "An optional string."
let forcedString: String = possibleString! // 需要惊叹号来获取值

let assumedString: String! = "An implicitly unwrapped optional string."

let implicitString: String = assumedString // 不需要感叹号 

通过对比可以看出,隐式解析可选类型在get值的时候不需要强制解析,而普通的可选类型却需要强制解析。隐式解析顾名思义就是没有看到解析就执行了解析








你可能感兴趣的:(iOS,可选类型optional,swift)