設計Optional的原因:

避免意外沒有值的狀況


各型別的定義方式:

var x:Int = 2
var words:String = "yo, man"
var isRightAnswer:Bool = true
會出錯的範例:
var x:int = nil
//直接存沒有值,會出錯
正確如下:
var x1:Int? = nil
x1 = 8
var words1:String? = "yo, man"
var isRightAnswer1:Bool? = true
//Int?   :稱為   Int optional;只能存「 整數」或「nil」
//String?:稱為String optional;只能存「 字串」或「nil」
//Bool?  :稱為  Bool optional;只能存「布林值」或「nil」
會出錯的範例:
let answer = x1 + 2
//以上會報錯,因為型別不同(x1:Int optional , 2:Int)

第一種解法:Force unwrapping(強迫解開Optional 的包裝)

var x2:Int? = nil
x2 = 8
print(x2! + 1)      // 可正常解(裡面有值)
var x3:Int? = nil
x3 = nil
print(x3! + 1)      //不可正常解(裡面是nil;程式會當掉)

第二種解法的方法:使用前先判斷是否為nil

var x4:Int? = nil
x4 = 8

if x4  != nil{ //1.如果x4不等於nil(確認有值)
    x4! + 1     //2.再用驚嘆號,把值取出來。 
}
print(x4)

第三種解法:optional Binding(最推薦)

用if let 常數 = Optional 的值
用if var 變數 = Optional 的值

範例程式:

var x:Int?
x = 8
if let myNumber = x{
    myNumber + 1
    }
//如果x可以順便把值存給常數myNumber(則代表x有值)

!與?的差異

var luckyNumber1:Int? = 7
print(luckyNumber1)
//產出結果:Optional(7)

var luckyNumber2:Int! = 8
print(luckyNumber2)
//產出結果:8

//二個都是Int optional
//差別在於!代表,裡面一定有值

練習:

  • highScore:紀錄最高分
  • 若player創紀錄,會把最新分數回存
  • 之後再玩遊戲,會再load最新的分數loadedScore
  • 網路斷線,可能會取到nil

範例:

//有新的分數,從雲端拉下來,取代目前最高分
var highScore:Int
var loadedScore:Int? = 1000
第一種寫法:(絕對不要這樣做)
    highScore = highScore!
第三種寫法:
if let okScore:Int = loadedScore{
    highScore = okScore
}else{
    highScore = 0
}
//如果loadedScore有值,就存進highScore裡
//若沒值,highScore就為0
第二種寫法:
if loadedScore != nil{
    highScore = loadedScore!
}else{
    highScore = 0
}
//loadedScore != nil:若loadedScore有值的話
//highScore = loadedScore!:loadingScore解開包裝,存進highScore裡面
第二種寫法:(簡寫)
highScore = loadedScore != nil ? loadedScore! : 0

//看情況是否成立
// 成立(有值):走前面的選項:loadedScore!(解包裝)
//不成立(無值):走後面的選項:0
第二種寫法:(再簡寫)
highScore = loadedScore ?? 0
// 成立(有值):loadedScore存入highScore
//不再立(無值):0

比較:

觀念釐清:

results matching ""

    No results matching ""