func symbolAp(){
//Int? 相當於 optional int 可選類型
//一般用於類型轉換可能會失敗,例如 字符串 sss 轉 int
let sym:Int? = 1
let sym2:Float? = Float("11.3") //sym2 = 11.3
let sym3:Float? = Float("as.v") // sym3 = nil
if sym2 != nil { //sym2的值爲 nil ,而不是Object-C 的空指針
print("sym2 = \((String(format:"%.2f",sym2!))) \n")
}
if sym3 == nil {
print("sym3 = nil,轉換失敗\n")
}
//as as! as?
/*as 類型轉換 從派生類轉換爲基類,向上轉型(upcasts)*/
let asNum = 10 as Int
var asNum2 = 19.11 as Float
var asNum3 = 19.11 as Float
/*as! 強轉 向下轉型(Downcasting)時使用。由於是強制類型轉換,如果轉換失敗會報 runtime 運行錯誤*/
let asNum4 = "19.11" as! Float //報錯
/*as? as? 和 as! 操作符的轉換規則完全一樣。但 as? 如果轉換不成功的時候便會返回一個 nil 對象。成功的話返回可選類型值 /(optional),需要我們拆包使用。
由於 as? 在轉換失敗的時候也不會出現錯誤,所以對於如果能確保100%會成功的轉換則可使用 as!,否則使用 as?*/
let asNum6 = "19.11" as? Int //因爲非強轉,所以失敗返回nil值
}
?可選鏈
class Apple {
var num:Int = 3
}
class Fruit {
var apple:Apple?
}
//?可以選鏈
/*
如果你訪問的值不是可選的,可選鏈式調用將會返回可選值。
如果你訪問的值就是可選的,可選鏈式調用不會讓可選返回值變得“更可選”。
因此:
通過可選鏈式調用訪問一個Int值,將會返回Int?,無論使用了多少層可選鏈式調用。
類似的,通過可選鏈式調用訪問Int?值,依舊會返回Int?值,並不會返回Int??。
*/
func canType (){
var fruit = Fruit()
let t = fruit.apple?.num //?可選,允許返回nil值
// let b = fruit.apple!.num //!強制打開,如果nil 運行時報錯 fatal error: unexpectedly found nil while unwrapping an Optional value
//實例 賦值
fruit.apple = Apple()
let c = fruit.apple!.num //c=3 這樣實例後 強行打開也不會報錯
}