1.可选类型
- 可选类型表示变量可以有值, 也可以没有值
- C 和 Objective-C 中并没有可选类型这个概念
- Swift中
只有可选类型才可以赋值为nil
- 如果你声明一个可选常量或者变量但是没有赋值,它们会自动被设置为nil
2.可选�类型格式
-
格式: Optional<类型> 或 在类型后面加上?号
var number: Optional<Int>
-
可选类型的取值是一个枚举
-
None 没有值
-
Some 有值
-
由于可选类型在Swift中随处可见, 所以系统做了一个
语法糖
, 在类型后面加上?
var number: Int?
注意:- nil不能用于非可选的常量和变量。如果你的代码中有常量或者变量需要处理值缺失的情况,请把它们声明成对应的可选类型。
- Swift 的nil和 Objective-C 中的nil并不一样。在 Objective-C 中,nil是一个指向不存在对象的指针, 所以Objective-C只有对象类型才能被设置为nil(基本类型不行)。在 Swift 中,
nil不是指针——它是一个确定的值,用来表示值缺失
。任何类型的可选状态都可以被设置为nil,不只是对象类型。
3.推荐写法
var number1: Double?//如果初始化不写值,那么默认为nil
number = 2;
// Swift中可选类型的值不能当做普通类型的值来使用
// 如果想使用可选类型的值必须进行`解包`操作
// 只需要在变量/常量后面加上! 就可以解包
// * 解包代表着告诉系统, 该变量/常量中一定有值
var pi: Double?
pi = 3.14
print(pi)//打印出来是Optional(3.14)
4.解包
4.1强制解析(forced unwrapping)
- 通过感汉号实现:!,如:
number!
- init? 构造函数, ?表示不一定能够实例化出对象
- !表示告诉编译器一定有值, 编译能够通过, 如果运行时没有值就会直接
崩溃
- 提示: ? 和 ! 是所有刚刚接触Swift的OC程序员最最蛋疼的问题, 前期开发要注意多看文档和利用编译器提示解决(option + 左击鼠标变量)
注意 - 在Swift开发中, 尽量不要使用强制解包, 不安全
//let url: NSURL?
let url = NSURL(string: "http://www.baidu.com")
print(url)
url!
4.2可选绑定解包(optional binding)
- 不需要考虑url是否有值, 能进入{}一定有值
- 不仅可以用来判断可选类型中是否有值,同时可以将可选类型中的值赋给一个常量或者变量
- 可选绑定可以用在if和while语句中
- 提示:
在实际开发中,使用频率很高
- 可选绑定中的变量/常量只能在if后面的{}中使用
if let temp = url {
url//能进来,那么url是一定有值的
}
//但是当可选类型过多时,出现下面情况,代码看起来就非常low了
let value1: Int? = 10
let value2: Int? = 20
let value3: Int? = 30
let value4: Int? = 40
if let temp1 = value1 {
if let temp2 = value2 {
if let temp3 = value3 {
if let temp4 = value4 {
let sum = temp1 + temp2 + temp3 + temp4
}
}
}
}
guard
- guard语句是在Swift 2.0中引进的,它是用途是
在未满足某个条件时,提供一个退出的路径
- 格式:
guard 表达式 else{}
注意: - guard中的变量/常量 可以在guard后面使用
- guard一般用于避免使用强制拆包, 优化代码结构
func test() {
let value1: Int? = 10
let value2: Int? = 20
let value3: Int? = 30
let value4: Int? = 40
guard let temp1 = value1 else {//guard一般写在函数里
return
}
guard let temp2 = value2 else {
return
}
guard let temp3 = value3 else {
return
}
guard let temp4 = value4 else {
return
}
let sum = temp1 + temp2 + temp3 + temp4
print(sum)
}
4.3隐式解析可选类型(implicitly unwrapped optionals)
- 有时候在程序架构中,第一次被赋值之后,可以确定一个可选类型总会有值。在这种情况下,每次都要判断和解析可选值是非常低效的,因为可以确定它总会有值
- 隐式解析可选类型, 并不需要每次都使用解析来获取可选值, 一个隐式解析可选类型其实就是一个普通类型,但是可以被当做非可选类型来使用
- 格式:
将可选类型后面的?改为!
示例: let loginBtn: UIButton!
- 注意:如果一个变量之后可能变成nil的话请不要使用隐式解析可选类型。如果你需要在变量的生命周期中判断是否是nil的话,请使用普通可选类型
//这种多用于storyboard或xib连线时定义的属性
var button: UIButton!
button = UIButton()
print(button)
网友评论