小弟的規劃表 - http://blog.kerkerj.in/blog/2014/11/01/planning/
好讀版 - http://blog.kerkerj.in/blog/2014/10/04/swift-d4/
=
今天要來探討 Optional 型別,我認為這塊是初學 Swift 常遇到的問題
大家搞不懂 「!」 「?」 到底在幹什麼,所以今天就來瞭解一下
在 Swift 中,所有的資料型別都不能賦予 nil
也就是以下這件事是不成立的:
var x: String = "test"
x = nil
所以在 Swift 底下,就要使用 Optional 來處理值可能不存在的情況
當一個變數 x 被宣告成 Optional 型別時,該變數就會有兩個情況:
1. 有值,等於 x
2. 沒有值
要宣告一個變數可能為 nil 時的方式是使用問號 『?』:
// 此時 x = "yaya"
var x: String? = "yaya"
// 此時 x 沒有值
x = nil
拿以下程式在 Playground 執行看看:
var str: String = ""
println(str)
str = "yaya"
println(str)
var str2: String?
println(str2)
str2 = "yaya"
println(str2)
可以看一下 Playground 右邊的輸出框,觀察兩個 string 的差異
當 str2 被賦予 Optional 型別後,
str2 已經不是單純的 String 型別了,
那如何強制以 String 型別拿到 str2 的資料呢? 試著在 str2 後面加上驚嘆號,並觀察右方輸出結果:
println(str2!)
請注意!若要強制取值,一定要確保此 Optional 型別中一定有值, 否則將會導致執行錯誤,以下是錯誤範例:
var str2: String? = "yaya"
println(str2)
str2 = nil
println(str2!)
程式將會在第四行返回錯誤,因此使用驚嘆號強制取值前請先確保 Optional 裡有值。
在 Objective-C 中,nil 是指向一個不存在物件的指標; 而 Swift 中,nil 是一種非常明確地值 - 他就是代表「不存在」。
在 Playground 中多試試看囉~~
ps. Swift 的 ? 和 Ruby 的 ? 是完全不同意思的XD