流程控制 If- else

流程控制 If- else

  • 在if語句中,條件必須是一個BOOL表達式。
  • 可以同時使用if和let來與可能不存在值(nil)協同運作。
  • 這一類的值呈現為選擇值(optional value)。
  • 選擇值可能有值,也有可能為空值(nil)。
  • 可以在型別之後加上問號(?)來表示其值為選擇性,可以為空值。
  • 不是選擇性型別不得設定為空值(nil)。

var testString = "abc"      //因為已經設定初值,此行敘述運用型別推測機制,會直接配置記憶體
testString = "def"
//testString = nil    //error:'nil' cannot be assigned to type 'String'


var testString2:String  //因為明確指定型別不得為空值,當沒有設定初始值時,不會真正配置到記憶體
testString2 = "xyz"

宣告optionalString變數為String型別的包裝盒,當包裝盒為空時,即為nil

var optionalString: String?     //即使此時尚未設定初值,會直接配置記憶體,但其值為nil

注意:當型別的包裝盒為空值時,不可以執行拆封取出其值的動作


print(optionalString!)  //error: Execution was interrupted(runtime error)
optionalString = "Hello"        //在String型別的包裝盒中存放Hello字串
print(optionalString!)  //拆開(unwrap)包裝盒,使用美工刀(!)才能取出包裝盒中的字串

列印包裝盒是否為空的結果

print(optionalString == nil)	// false

optionalString = nil
if optionalString == nil
{
    print("String包裝盒裡沒有任何東西!")
}
else
{
    print(optionalString!)
}

// 結果:
String包裝盒裡沒有任何東西!

測試


var arrDouble:[Double?] = [12.23,23.22,nil]
var arrInt:[Int]?
print(Int(arrDouble[0]!))

//結果:
12

測試


var optionalName:String? = "John Appleseed"
var greeting = "Hello!"
print(optionalName)
//結果:
Optional("John Appleseed")

【練習4】

//選擇性綁定(optional binding)
if let aname = optionalName      //如果型別的包裝盒中有值,則綁定成功,會自動拆封其值到對應的常數name
{
    greeting = "Hello, \(aname)"
}
else    //如果綁定不成功,則執行else程式區段
{
    print("Hello")
}

//結果:
"Hello, John Appleseed"

//注意:也可以使用guard let執行選擇性綁定,綁定的結果(bname)可以在guard let之外使用,但目前限定此語法只能用在函式之內,且在else段最後一行必須為return
//
//guard let bname = optionalName
//else
//{
//    print("Hello")
//    return
//}