可选类型
在Swift中,可选类型其根源是一个枚举型,里面有None和Some两种类型.其实所谓的nil就是Optional.None,非nil就是Optional.Some,然后会通过Some(T)包装(wrap)原始值,这也就是使用Optional时为什么要拆包(从enum里取出原始值)的原因,也就是PlayGround会把Optional值显示为类似{Some "hello word"}的原因
///可选类型类似于oc指针中指针的nil值,但是oc中nil只对类(class)有用,指针对象不存在,而Swift中的nil不是指针,他表示特定类型的值不存在.任何类型的可选类型都能赋值为nil,而不仅仅局限于对象类型,而且更安全
/*
注意: 1.在swift中,非可选类型不能用nil,nil只能用于可选类型中;
2.如果代码中的常量变量需要适配不存在的情况,务必将它声明为恰当的可选类型;
3.如果定义的可选类型的对象不提供默认值,则该对象默认将自动为nil,如:var strValue: String?; 默认值则为nil
总结?的使用场景
1.声明Optional变量
2.用Optional值操作中,用来判断是否响应后面的操作
*/
//解包(!的用法)
/*
可选类型在每次访问的时候都会提前并检测它的值是否存在,但有时有根据程序结构就可以推断出可选类型在首次赋值之后必然存在值,这个时候,就不需要每次后检测值是否存在,如果确定一个可选类型的值一定存在,那么我们使用"!"进行解包获取它的值,或者使用Optional Binding
*/
let possibleString: String? ="An Optional String";
println("possibleString = \(possibleString!)");//确定该变量有值,则直接进行解包即可(强制解包)
let stringValue = possibleString!.hashValue;
println(stringValue);
//Optional Binding//等价于上面(可选绑定)
if let sValue = possibleString {
let stringValue = sValue.hashValue;
}
//关于隐式解包
/*
把隐式解包可选类型当做自动解包的可选类型.即不是每次使用的时候在常量/变量后面加!,而是直接在定义的时候加!,这些可选变量定义为隐式解包的可选量(implicitly unwrapped optional).
隐式解包的可选量的声明格式为:在希望标为可选的类型名称后面,用感叹号(!)代替问号(?)
隐式解包的可选类型主要用在一个变量/常量在定义瞬间完成之后值一定会存在的情况.主要用在类的初始化过程中.
*/
let assumeString: String! ="Hello";
println(assumeString);
println(assumeString.hashValue);
这里格外重点说一下可选绑定:
直接上例子
var name: String? //定义可选类型
name = "kris" //给可选类型赋值
可选类型取值方式一:
print(name!) //从可选类型中取值
//注意:如果可选类型中没有值,那么强制解包程序会崩溃
//强制解包是一个非常危险的操作,建议在解包前先判断可选类型中是否有值
可选类型取值方式二:
if name! =nil{
print(name!)
}
可选类型取值方式三:
可选绑定
1.判断name是否有值,如果没有值,则不执行{}
2.如果有值,则对可选类型进行解包,并且将解包后的值赋值给前面的常量
if let tempName = name{
print(tempName)
}
可选绑定精简版(用的最多)
if let name = name {
print(name)
}