# 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  這個 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) } ```
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up