Swfit5.2-可选类型(Optionals)

2020-09-01  本文已影响0人  Gomu_iOS

一、声明

二、定义

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 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中方式简约,不建议
}


上一篇 下一篇

猜你喜欢

热点阅读