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 这样实例后 强行打开也不会报错
}