猫猫学swift3.1(二)可选类型_解包_可选链
2017-07-10 11:18
232 查看
猫猫分享,必须精品
原创文章,欢迎转载。转载请注明:翟乃玉的博客
地址:http://write.blog.csdn.net/postlist
在swift中,nil 也是一种数据类型 (补充:nil 的内存地址是0x0),什么是可选类型,当一个标识符所代表的对象可以被赋值为nil时,这个标识符的类型就是一个可选类型.
首先我们描绘这样一个场景
小玉有一只叫贝贝的猫,贝贝有一个叫”纸盒”的玩具
小明有一只没有名字的猫,猫木有玩具 (小明一直都很屌丝…)
然后我们根据数据结构简单建造了以下三个类
但是,上面在解包的时候,我用了一个?.
因为 每个人不一定都有一只猫(看类的数据结构), 所以person的cat可能为nil,也就是cat是可选类型
但是我们需要调用cat的一些方法,甚至是cat的玩具的方法,nil是没有方法的,难道我们要一层层的解包? 太痛苦了, swift给了我们一个叫做可选链的方式 如下
(小明家的猫:没有你让我玩蛇啊)
原创文章,欢迎转载。转载请注明:翟乃玉的博客
地址:http://write.blog.csdn.net/postlist
一:可选类型简介
在oc中,如果一个对象我们没有用到,如果他是基础数据类型(int bool double float 这样的不带的),他会默认为0,如果他是对象类型(NSObject 带的),默认会为nil在swift中,nil 也是一种数据类型 (补充:nil 的内存地址是0x0),什么是可选类型,当一个标识符所代表的对象可以被赋值为nil时,这个标识符的类型就是一个可选类型.
1:可选类型的写法
//写法一: var a1:Optional<String> = nil a1 = "我是可选类型" //写法二: var a2:String? = nil a2 = "写法二"
2:自己理解
其实,从写法上我们很容易看出,可选类型其实是一个泛型集合,这个集合只有一个值,其实我们可以理解为是一个只有一个元素的数组,我们可以用数组的方式来研究可选类型的初始化,赋值等一系列操作.var o1:[String] = [String]() //赋值nil o1 = ["自己实现可选类型"] //赋值 let o1Value = o1.first //获取到详细数据 var o2:String? = nil//赋值nil o2 = "自己实现可选类型"//赋值
二: 可选类型的解包
场景描述:首先我们描绘这样一个场景
小玉有一只叫贝贝的猫,贝贝有一个叫”纸盒”的玩具
小明有一只没有名字的猫,猫木有玩具 (小明一直都很屌丝…)
然后我们根据数据结构简单建造了以下三个类
class Person{ var name:String var cat:Cat? init(name:String){ self.name = name } } class Cat{ var name:String? var toy:Toy? func eating(){ print("猫在吃东西") } } class Toy{ var name:String? func playing(who:String) { print("正在被\(who)玩ing...") } } //小玉: let persion1 = Person(name: "小玉") let cat1 = Cat() cat1.name = "贝贝" persion1.cat = cat1 let toy1 = Toy() toy1.name = "纸盒" cat1.toy = toy1 //小明: let persion2 = Person(name: "小明") let cat2 = Cat() persion2.cat = cat2
1:解包
如果我们想拿到他们宠物的名字,我们会发现,小明的宠物是无名,这时候我们就需要解包了,因为你拿到的是一个可选类型(可以是有名字的贝贝可以是无名的)解包方式
//方式一: 强制解包! let catName = persion1.cat?.name print(catName!) //方式二:可选绑定 if let catName = catName { print("可选绑定 ---- "+catName) }
三: 可选类型可选链
可选链介绍
swift 中我们在调用函数或者属性的时候,用的是.但是,上面在解包的时候,我用了一个?.
因为 每个人不一定都有一只猫(看类的数据结构), 所以person的cat可能为nil,也就是cat是可选类型
var cat:Cat?
但是我们需要调用cat的一些方法,甚至是cat的玩具的方法,nil是没有方法的,难道我们要一层层的解包? 太痛苦了, swift给了我们一个叫做可选链的方式 如下
//让小玉家的贝贝吃饭 persion1.cat?.eating() //让小玉家的贝贝的玩具被玩 persion1.cat?.toy?.playing(who: "小玉家的贝贝") // 没有的情况 让小明家的猫的玩具被玩 persion2.cat?.toy?.playing(who: "小明家的猫") // 并没有打印,因为小明家的猫的玩具是nil
(小明家的猫:没有你让我玩蛇啊)
相关文章推荐
- swift自学笔记(七)(可选类型、隐式解包、可选绑定)
- swift 学习计划(一) 解包、隐式解包的可选类型
- Swift中可选类型隐式解包判断空会报错
- swift中的可选类型Optional?、解包!和隐式解包的可选类型的用法
- Swift-可选类型(Optional)以及解包
- 14.4 Swift中weak引用 访问可选类型的时候,用隐式解包
- 窥探Swift之新添数据类型元组与可选值
- Swift中非可选的可选值类型处理方法详解
- Swift 可选类型(补充)
- Swift 可选类型
- Swift快速入门之可选类型与错误处理
- Swift类型推测在可选调用中的小提示
- Swift可选类型(Optional)之星耀
- 窥探Swift之新添数据类型元组与可选值
- Swift学习记录 -- 10.可选类型的使用
- Swift傻傻分不清楚系列(三)元组与可选类型
- Swift 可选类型
- swift 可选类型使用场景示例
- swift 之可选类型
- Swift中的可选类型(Optional)