Swift入门(四)——可选类型(Optionals)与断言(Assert)

来源:互联网 发布:心理学电脑软件 编辑:程序博客网 时间:2024/06/08 15:47

可选类型是什么?

首先看一个问题,Swift中String类型的变量有一个叫做toInt的方法,可以把String类型变量转换为Int类型变量。

var stringValue = "5"var intValue = stringValue.toInt();println("intvalue = \(intValue)")

执行以上方法后得到了奇怪的结果:

intvalue = Optional(5)

其实,可以发现,toInt方法的返回值并不是Int,而是Int?这是因为Swift提供了一种叫做“可选类型”(Optionals)的新类型。String和Int类型对应的可选类型分别是String?和Int?

因为并不是每个字符串都可以转换为整数,也就是说在执行

var intValue = stringValue.toInt();

这句代码的时候,并不知道intValue的具体值。如果stringValue无法转换为Int类型,那么这里的intValue的值为nil。

和OC不同的是,nil并不是一个空指针,也不只限于对象类型,而表示任意一个可选类型的变量的值缺失。String?和Int?等可选类型的变量值均可以为nil。比如执行以下代码:

var stringValue = "53d"var intValue = stringValue.toInt();println("intvalue = \(intValue)")

得到的结果会是:

intvalue = nil

可选类型与隐式可选类型

强制解封可选类型

如果想要使用转换后的变量值,而不出现Optional(xxx)这样奇怪的表示的话,可以使用感叹号(!)运算符,强制使用可选类型变量里面的值。这在Swift里面叫做强制解封(Forced unwrapping of the optional’s value)。

然而强制解封一个值为nil 的可选类型会导致运行时错误(runtime error)。因此,在使用感叹号(!)运算符强制解封可选类型变量时,一定要确保可选类型变量的值不为nil。

下面的代码具体解释了之前的概念:

var stringValue1 = "55"var stringValue2 = "5d"var intValueNotNil = stringValue1.toInt();var intValueNil = stringValue2.toInt();println("intvalue1 = \(intValueNotNil!)") //强制解封,正常运行println("intvalue2 = \(intValueNil!)") //强制解封,运行时错误。

需要再次提醒的是,运行时错误无法被编译器发现,会导致app直接闪退。所以正确的强制解封方案应该如下:

let unknownValue:Int? = 3//let unknownValue:Int? = nilif unknownValue != nil{    println("value = \(unknownValue!)")}else{    println("value = \(unknownValue)") //不强制解封,直接打印nil}

还有一点需要注意的是,可选类型在定义的时候必须赋初值。不可以用类型标注的方式跳过赋初值,否则会产生编译错误。

可选绑定

Swift是一门简洁的语言,使用强制类型解封来获取可选类型变量里的值过于麻烦,是很多人不愿意使用的。因此,可以通过可选绑定的方式来解封可选类型中的值。

let unknownValue:Int? = 3//let unknownValue:Int? = nilif var variable = unknownValue {    println("variable = \(variable)")}

可选绑定的关键在于if判断里的赋值语句。如果unknownValue的值为nil,if判断不成立。如果unknownValue的值不为nil,那么variable将会得到unknownValue解封后的值,因此在打印variable的时候不再需要使用感叹号(!)运算符。

隐式解封可选类型

隐式解封可选类型简称隐式可选类型,是与可选类型相对的概念。它需要在原基础类型后加上感叹号。比如以下代码可以定义一个隐式可选类型:

var implicitOptional:Int! = 3

隐式可选类型表示默认这个变量中一直有值(即不为nil)。使用隐式可选类型就赋予了Swift自动解封隐式可选类型的权利,不需要调用感叹号(!)运算符即可解封隐式可选类型。

var implicitOptional:Int! = 3if implicitOptional != nil{    println("implicitOptional = \(implicitOptional)")}

输出结果:

implicitOptional = 3

需要注意的是,隐式可选类型其实也是一种可选类型,也就是说,如果隐式可选类型的值为nil,依然会触发运行时错误(Runtime Error)。所以在使用隐式可选类型变量时,为了安全起见,还是应该用if语句进行判断。

除了在后文介绍无主引用时提到的隐式可选类型的使用场景外,不建议使用隐式可选类型。直接用可选类型代替即可

隐式可选绑定

隐式可选类型的可选绑定被称为隐式可选绑定,和可选类型的可选绑定在使用上完全一致。不过没有必要仔细研究了。示例代码如下:

var implicitOptional:Int! = nil//var implicitOptional:Int! = 3if var unknownImplicitOptional = implicitOptional{    println("implicitOptional = \(unknownImplicitOptional)")}

断言

断言其实与可选类型毫无干系,它的使用可以帮助程序员比较容易的发现和定位错误,使用上也并不难,因此就放在第四章最后一并介绍了。

在Swift中,通过assert函数实现断言,其中第一个参数为判断条件,第二个参数为条件不满足时的打印信息。

let age = 20assert(age > 20, "你是成年人啦!")

如果断言被触发,将会强制结束程序,并输出相关信息:

assertion failed: 你是成年人啦!: file /Users/KT/Desktop/MyIOS/Swift练习/Swift——可选类型/Swift——可选类型/main.swift, line 45(lldb) 

使用断言非常简单,但是合理的添加断言,有助于定位和排除bug,是在使用Swift中的一个好习惯。

附录

查看完整专栏——《Swift轻松入门》

【Swift入门(一)——基本语法】
【Swift入门(二)——字符与字符串】
【Swift入门(三)——元组(Tuple)】
【Swift入门(四)——可选类型(Optionals)与断言(Assert)】
【Swift入门(五)——数组(Array)】
【Swift入门(六)——字典(Dictionary)】
【Swift入门(七)——结构体(Struct)】
【Swift入门(八)——功能强大的求余运算符】
【Swift入门(九)——String与Int、Double、Float等数字相互转换】
【Swift入门(十)——循环引用、弱引用和无主引用】
【Swift入门(十一)——类型转换与is、as操作】
【Swift入门(十二)——利用Extension添加逆序输出字符串方法】

1 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 博瑞智教育是上当了怎么办 我43岁记忆力差怎么办 艾灸灸出的湿疹怎么办 饭店合同到期房东不租怎么办 极端暴力控制不住自己怎么办 苹果已停止访问该网页怎么办 qq登陆后隐藏了怎么办 易班密码忘记了怎么办 老师上课讲错了怎么办 专升本差了一分怎么办 登录不上学信网怎么办 steam被好友删了怎么办 护士继续教育学分证丢了怎么办 护士证到期未延续注册怎么办 学籍和户口不在一起小升初怎么办 定了酒店不能退怎么办 去哪儿网酒店不允许取消怎么办 快递寄送身份证扣海关怎么办 7岁龋齿烂到牙根怎么办 法院判完对方说没钱怎么办 初中填完志愿后怎么办 上海小学借读一年级没有学籍怎么办 学历不高的我该怎么办 没学历的我该怎么办 物业达不到服务标准该怎么办 没有能力的人该怎么办 工作累了腰疼怎么办 机场来早了6小时怎么办 苏宁金融综合评分不足怎么办 苏宁金融秒拒怎么办 微盘账号忘记了怎么办 天府e税忘记密码怎么办 未成年在外面没地方住怎么办? 半框眼镜片掉了怎么办 选修差0.5个学分怎么办 脱产考博社保卡怎么办 幼儿上课不认真听讲怎么办 手机恢复的音频文件打不开怎么办 高考志愿填报不记得密码怎么办 经济纠纷案被告没有证据怎么办 管家婆管理员密码忘记了怎么办