---
# System prepended metadata

title: 04/08 (五) optional

---

# 04/08 (五) optional



:::success
- optional 還沒講完，下次再花一點時間講。會包含 generic 一起講，才過到 optional 的實作。 :heavy_check_mark: 
:::


:::warning
- Next: 分享 web player 專案的現況
- Kotlin 的 error handling 
- JS 的 error handling
- MVC 
- MVVM (android 教學)
- @Ralf & @Isaac 教學 `*` `&` (C++)
- @Ralf 說要研究 js 的 null & undefined & ??
:::


### optional

- 可以為空的變數 nullable variable

```swift=
var num: Int? = nil
num = 123

if let newNum = num {
    print(newNum)
} else {
    // nil
}

let newNum: Int = num ?? 0
// 如果 num 是空值，就給 ?? 後面的預設值。

let newNum: Int = num!
// force unwrap


if let age = objc?.age {
    print(age)
}
    
let age: Int? = objc?.age
    
var bob: Person!
// 理解為「告訴 compiler 不要檢查變數會不會被餵值」
// 缺點是：如果真的沒有餵值又去取值的話，app 會 crash
bob = Person()
bob.age = 23
let age = bob.age
// 當 bob 變數內真的有一個 Person 的物件實體了之後，對 bob 做操作才不會造成 crash 
// 否則 bob 一直不是一個人（空的），哪怕做任何操作都是
```

```kotlin=
// let newNum: Int = num ?? 0
val num: Int? = null
val newNum = num ?: 0    

// var bob: Person
lateinit var bob: Person
bob.age = 25 // crash
bob = Person()
bob.age = 25 // Pass

// var bob: Person
var bob: Person? = null
bob = Person()
bob?.age = 25
print(bob!!.age)  // 暴力描述bob一定不是null，但若是 null就會 crash
print(bob?.age ?: 0)
bob.age = 10

val object = Gson.fromJson(response, Person::class.java)
object!!.method() // 不建議
object?.let { obj -> 
    obj.method1()
    obj.method2()
    obj.method3()
}
```



### Guard
![](https://i.imgur.com/p8B9uHC.png)

這個 keyword 是源自於 **Guard Clause / Early Return**
``` Swift
if (num == nil) { return }
guard (num != nil) else { return }

guard account.isValid else { // 無效會員; return }
// 有效會員
```



Kotlin 的 "!"
```kotlin=

var n: Int? = null

//經過一些計算後
var a: Int = 0

a = n!!
```




### error handling

```swift=
do {
    let decoder = JSONDecoder()
    let product = try decoder.decode(Person.self, from: jsonData)
} catch error {
    print(error)
}
```

