Unlocking the Power of ChatGPT and AI in Testing - A Real-World Look, present...
Optional in swift
1. ? 和 ! 略懂略懂 (︖?!
Optional in Swift
Grady Zhuo
github.com/gradyzhuo
facebook.com/gradyzhuo
2. 什麼是Optional - 1
❖ Swift also introduces optional types, which handle the
absence of a value. Optionals say either “there is a
value, and it equals x” or “there isn’t a value at all”.
Optionals are similar to using nil with pointers in
Objective-C, but they work for any type, not just classes.
Optionals are safer and more expressive than nil
pointers in Objective-C and are at the heart of many of
Swift’s most powerful features.
3. 什麼是Optional - 2
❖ Optional是Swift中,做為處理可能存在nil值變數的機制。︒
❖ Optional 是⼀一個enum,存在兩種可能:
❖ Some : 有值存在
❖ None : 無值存在
————————————————————————
enum Optional<T> : Reflectable, NilLiteralConvertible {
case None
case Some(T)
}
7. 「?」 做了什麼事呢︖?
❖ 「?」 是什麼︖? 「?」是 Optional<T> 的「語法糖衣1」
❖ e.g. 有值的狀況
var i : Int? = 10
var i : Optional<Int> = Optional<Int>.Some(10)
❖ e.g. 沒有值的狀況
var j : Int? = nil
var j : Optional<Int> = Optional<Int>.None
12. 宣告時⽤用的「!」
❖ 宣告的狀況下,「!」跟「?」的⾏行為類似, 都可以塞進nil。︒
❖ 但使⽤用時,如果是nil,就會Crash...(Why?
❖ e.g. 有值的狀況
var i : Int! = 3
var k = i + 1 => 3 //不是Optional
❖ e.g. 沒有值的狀況
var j : Int!
var l = j + 1 //Crash
13. 宣告時的「!」,做了什麼︖? - 1
❖ 宣告時使⽤用「!」就像在箱⼦子旁邊貼著⼀一把「⼑刀」,這把⼑刀就像被
動技能⼀一樣,只要操作variable,就會⾃自動啟動Unwrapping。︒
❖ e.g. 剛剛有值的例⼦子
❖ var i : Int! = 3
❖ var k = i + 1 => 3
//所以上⾯面的寫法,會等於下⾯面的寫法。︒
❖ var i : Int? = 3
❖ var k = i! + 1 => 3 //因為i有值,所以unwrap有值,⼀一切正常。︒
錢鬼,我還你原形!(誤
19. ??
❖ Swift導入了 「??」⼆二元運算⼦子,他的規則如下:
❖ (Value) = Optional(T) ?? (Default Value)
❖ 如果「??」左邊為nil, 會回傳「??」右邊的的值(通常是Default值)
❖ e.g.
❖ var i : Int? = 3
❖ var j = i ?? 0 // j == 3
❖ ——————————-
❖ var i:Int?
❖ var j = i ?? 0 // j == 0
20. Optional Chaining
❖ Optional chaining is a process for querying and calling properties,
methods, and subscripts on an optional that might currently be nil.
❖ 可以在好幾層的Optional中使⽤用「?.」的語法取值操作,若過程中有任何
操作出現nil, 會直接回傳nil, 且接下來的事情都不會進⾏行,也不會crash。︒
❖ var array:[Int]? = []
❖ array?.append(0)
❖ //
❖ var array2:[Int]?
❖ array2?.append(1) //不會crash, 且什麼事都不會發⽣生
23. enum in Swift
//: Swift中的enum有⼀一個特例的⽤用法,那就是可以塞東⻄西
enum MyEnum {
case Value(str:String)
}
//: 這樣我們可以做出許多都是MyEnum的enum變數,但內容不⼀一樣
var enum1 = MyEnum.Value(str: "Hello")
var enum2 = MyEnum.Value(str: "World")
24. enum in Swift
//: 也可以取出他們的值
func getValue(enumValue:MyEnum)->String{
switch enumValue {
case let .Value(str):
return str
}
}
let enum1Value = getValue(enum1) //enum1Value == “Hello”
let enum2Value = getValue(enum2) //enum2Value == “World”