前言
最近要做一个Swift开发的app,之前一直在用Objective-C做开发,其实早就想试试Swift开发了,就借此机会学习一下Swift。再说一句,我是看着斯坦福大学的iOS课程,也就是白胡子老爷爷讲的,话说老爷子讲的真的不错。视频、PDF文件在iTunse U 上面都有,有兴趣的可以去下载学习。
Optional
在刚开始接触Swift的时候经常看到变量后面跟着 ?
或者 !
那我们是怎么用Optional的呢?
let x: String? = "hello world" //这是一个Optional类型的常量,它可能是String类型的,也可能是none。
因为 An Optional is just an enum
enum Optional<T> { // T 泛型 指明Optional可能的类型, 上面的Optional就可能是String类型的
case none //另外注意一点的是,在Swift 3 中enum 中的元素首字母都变成小写的, 之前都是大写的。
case some(T)
}
所以说
let x: String? = nil
let y: String? = "hello world"
等于
let x = Optional<String>.none
let y = Optional<String>.some("hello world")
Optionals can be "chained"
var display: UILable?
if let lable = display {
if let text = lable.text {
let x = text.hashValue
.......
}
}
等于
if let x = display?.text?.hashValue { .... }
这里当display为空的时候, 就直接返回nil, 不会去执行后面的text,当text为空返回nil,不会去管后面的事情。(这里解释的不是很清楚, 希望有更好的解释)!
There is also an Optional "defaulting" operator ??
Optional Unwrapping
-
Optional Binding
使用if let
,guard let
, andswitch
来拆包
let x: String? = "hello World"
if let str = x {
print(str)
}
-
Unconditional Unwrapping
使用!
来强制拆包(Unwrapping)
var x: String = .none
x = "hello world"
let str = x!.hashValue
当你确定instance of Optional 一定包含值的时候才可以强制拆包
当强制拆包时,值为空的时候就会报错。