?!as
2018-11-18 本文已影响0人
rajs20222007
?表示可能为空
假设没有“?”,原来该怎么用怎么用,比如self.a.b.c
但如果self或a或b为空,可能会奔溃;
这时对可能为空的地方加上?,就能避免奔溃;
self?.a?.b?.c
!表示一定有值
self.textLabel!.text = "I am Label"
as 有保证的转换,从派生类转换为基类的向上转型
let num = 1 as CGFloat
|------------------------
// dog转换到父类animal
class Animal {}
class Dog: Animal {}
let d = Dog()
d as Animal
as! 有强项转换,即向下转型
// Dog到Animal的转化
class Animal {}
class Dog: Animal {}
let a: Animal = Dog()
a as Dog // as不能将a转成Dog,即不能向下转换
a as! Dog // as!能强行将a转成Dog -> Bingo
as? 转换不成功的时候便会返回一个 nil 对象。成功的话返回可选类型值(optional)
// Dog、Cat和Animal的转换关系
class Animal {}
class Cat: Animal {}
class Dog: Animal {
var name = "Spot"
}
let dog: Dog? = nil
dog?.name // 选择调用,返回空值nil
dog!.name // 强行调用,报错
let animal: Animal = Cat()
animal as? Dog // 猫转狗失败,返回nil
animal as! Dog // 猫强行转狗,失败报错
??双问好
用法:newValue = optionalValue ?? value
若optionalValue非nil时,newValue的值为optionalValue的值,若optionalValue为nil时,newValue的值为value的值
let object = self.objectForKey(key) ?? Int(0)