Swfit5.2-可选类型(Optionals)
2020-09-01 本文已影响0人
Gomu_iOS
一、声明
- 内容仅作为博主个人学习的一个总结输出,仅供参考,若对你产生了一丝帮助,荣幸之至。
二、定义
- 可选类型是 Swift 用来处理变量/常量的值缺失情况的一种申明。符号标识: < ? > ,简单理解就是变量/常量的值可以为nil
var name: String? //: name 为可选类型
var age: Int //: 注意,这样的申明默认为隐式解包,即系统会自动在 Int 后面加上 < ! >,**var age: Int!**
三、作用
- 增加代码的安全性,确定可选性不为空的时候才可以强制解包。没有值的时候,如果进行强行解包,程序会发生崩溃。
var age: Int?
let age1 = age! //: Fatal error: Unexpectedly found nil while unwrapping an Optional value
age = 12
let age2 = age! //: 完美运行
注:如果去掉 < ? >,age 会进行隐式解包,下面的代码 age1= age 后面不允许出现 < ! >,这样写会直接报错,去掉 < ! > ,也会报错,age 未初始化,所以可选类型在实际开发中可以用来存一些服务器返回的数据(申明的时候不需要初始化的数据),非可选数据不能强制解包
- 多值判断的条件必须为可选类型。
var oName: String? = "张三"
var oAge: Int? = 18
//: 下面的判断必须 oName oAge 为可选类型才成立
//: 多值判断直接使用 , 分割
if let name = oName, let age = oAge {
print(name + String(age))
}
四、用法
- 表格要返回数据数量
var dataList: [String]?
//: ! 表示程序员来承诺 dataList 一定有值,为 nil 就崩!
//: 每一次写 ! 强行解包,一定要思考!
let count1 = dataList!.count
五、多重可选项 ?? 的使用
- 和三目运算同理,只是更简约
//: dataList? 表示dataList 可能为 nil
//: 如果为 nil, .count 不会报错,仍然返回 nil,那count就会取后面的 0
//: 如果不为 nil, .count 执行并且返回数组计数
let count = dataList?.count ?? 0
上面代码和下面同理
var count2: Int?
if dataList?.count == nil {
count2 = 0
}else{
count2 = dataList!.count
}
六、开发中的个人建议
- 申明类型的时候,只要是没有初始值的情况,尽量使用可选类型。
- 在使用可选类型时,尽量使用guard判断,增强代码的安全性。
- 开发中尽量少的使用 ! 强制解包。
guard let url = URL.init(string: "http://www.baidu.com/") else { return }
let req = URLRequest.init(url: url)
或者
if let url = URL.init(string: "http://www.baidu.com/") {
let req = URLRequest.init(url: url)
}
//: let url = URL.init(string: "http://www.baidu.com/") 这一句代码放在guard 或者 if 中会进行可选解包,下面的url就不用强制加上 !
//: 下面两种为强制解包写法,不建议
let url = URL.init(string: "http://www.baidu.com/")
let req = URLRequest.init(url: url! as URL) //:不严谨,url为niu就会崩溃
//可以优化成OC思维
if url != nil {
let req = URLRequest.init(url: url! as URL) //: 加一层判断更严谨,但是必须加上 ! 强制解包,没有上面2中方式简约,不建议
}