可选类型:
我们先看看如下代码:
var n1: Int = 10 n1 = nil //编译错误 let str: String = nil //编译错误
@H_301_43@Int和@H_301_43@String类型不能接受@H_301_43@nil的,但程序运行过程中有时被复制给@H_301_43@nil是在所难免的,@H_301_43@Swift为每一种数据类型提供一种可选类型(@H_301_43@optional),即在某个数据类型后面加上问号(@H_301_43@?)或感叹号(@H_301_43@!),修改前文示例代码:
var n1: Int? = 10 n1 = nil let str: String! = nil
@H_301_43@Int?和@H_301_43@String!都是原有类型@H_301_43@Int和@H_301_43@String可选类型,它们可以接受@H_301_43@nil。
可选类型值拆包
在可选类型的问号(@H_301_43@?)或感叹号(@H_301_43@!)究竟有什么区别呢?这与可选类型的“拆包”(@H_301_43@unwrapping)有关,拆包是将可选类型变成普通类型,如果我们直接打印非空的可选类型值,代码如下:
var n1: Int? = 10 print(n1)
输出的结果是@H_301_43@Optional(10),而非@H_301_43@10。所以试图计算表达式@H_301_43@n1+ 100会发生编译错误,代码如下:
var n1: Int? = 10 print(n1 + 100) //发生编译错误
需要对可选类型值进行“拆包”是必要地。
“拆包”分为显示拆包和隐性拆包。
使用问号(@H_301_43@?)声明的可选类型,在拆包时需要使用感叹号(@H_301_43@!),这种拆包方式称为“显式拆包”;
使用感叹号(@H_301_43@!)声明的可选类型,在拆包时可以不使用感叹号(@H_301_43@!),这种表示方式称为“隐式拆包”。
看看下面代码:
var n1: Int? = 10 print(n1! + 100) //显式拆包 var n2: Int! = 100 print(n2 + 200) //隐式拆包
欢迎关注关东升新浪微博@tony_关东升。
关注智捷课堂微信公共平台,了解最新技术文章、图书、教程信息
更多精品iOS、Cocos、移动设计课程请关注智捷课堂官方网站:http://www.zhijieketang.com智捷课堂论坛网站:http://51work6.com/forum.php