您的位置:首页 > 移动开发 > Swift

Swift-Optional(可选类型?!)

2015-08-18 11:32 330 查看
使用可选类型(optionals)来处理值可能缺失的情况

C和Objective-C中没有可选类型这个概念。最接近的是Objective-C中的一个方法要么返回一个对象要不返回nil,nil表示”缺少一个合法的对象“。然而这只作用于对象,对于结构体,基本的C类型或者枚举类型不起作用。对于这些类型,Objective-C方法一般会返回一个特殊值(NSNotFound)来暗示值缺失。这种方法假设方法的调用者知道并记得特殊值进行判断。然而Swift的可选类型可以让你暗示任意类型值的缺失,并不需要一个特殊值

Swift中的nil和objective-C中的nil并不一样,在Objective-C中,nil是一个指向不存在的对象的指针,在Swift中,nil不是指针,而是一个确定的值用来表示值缺失。任何类型的可选状态都可以被设置为nil,不只是对象类型

可选类型声明

var  aStr :String?
var bStr :Optional<String>


这两种类型的声明是一样的,其实Optional是一个枚举值,包含了两个元素None、Some,可以理解为,这是一个Optional类型的值,要么包含一个String类型的值(Optional.Some)要么就是nil(Optional.None)

使用

一个Optional类型的值是没有办法对其直接操作的,例如上面的声明,

let anum =  aStr.toInt()




怎么使用Optional类型的值?如果不确定该值是否为nil,那在直接操作的时候需要加上”?”,如果为nil,则不继续下一步操作,如果不为nil,则强制拆包执行后续操作(例如方法)

if语句强制解析

let anum = aStr!.toInt()当直接对可选类型进行强制解析(拆包),你必须确定,200%的确定该值一定不能为nil,否则在运行时会有发生Crash的风险。因此为了安全使用if语句

if  aStr != nil
{
let b = aStr!.toInt()
}


在上面语句中”!”的意思是确定该可选类型有值,可以使用

可选绑定(Optional binding)

使用可选绑定来判断可选类型是否包含值,如果包含就把值赋给一个临时变量或者常量。可选绑定可以用在if和while语句中来对可选类型的值进行判断。

if let c = aStr
{
let b = aStr!.toInt()
}


隐式解析可选类型

可选类型暗示了常量或者变量可以没有值(nil)。如果在程序架构中,第一次被赋值之后可以确定一个可选类型总是有值,如果每次都要判断和解析可选值的效率是很低的,因为可以确定它总是有值的。所以引入了隐式解析可选类型(implicity unwrapped optionals),在声明可选类型的时候将”?”改成”!”

var aStr :String!
let anum = aStr.toInt()


可以把隐式解析可选类型当做是一个可以自动解析的可选类型,如果没有给隐式解析可选类型赋值就尝试这取值,会发生Crash,和可选类型直接使用”!”取值一样


总结:使用”?”的场景:

1.声明Optional值变量

2.用于安全调用protocol的optional方法

3.使用 as? 向下转型

使用”!”的场景:

1.隐式解析可选类型的声明

2.强制对Optional类型的值拆包

引用:《The Swift Programming Language》

如有问题欢迎指正,谢谢
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息