- ?
代表这是个可选类型(
optional
)的。如下,如果num
有就为Int
类型的,如果没有值那么就是nil
let num:Int?
当我对
number
进行显示赋值时那么number
就是Int
类型的,如果没有对number
电视赋值,那么number
就为nil
类型
let number:Int? = 2
- !
如果要操作一个
optional
类型的变量,需要先进行强解包,这就需要用到!
了,如果有值就会得到变量的值,如果为nil
那么程序就会crash
// 定义一个string的可选类型str,显式赋值
var str: String? = "Hello"
let message = "你好" + str!
print(message)
// 定义一个string的可选类型str,不进行显式赋值,就会出现crash
var str2:String?
let message2 = "你好" + str2!
print(message2)
在第二段中就会报如下错误:
Fatal error: Unexpectedly found nil while unwrapping an Optional value
- as
有保证的转换,从派生类转换为基类的向上转型(
upcasts
)
(1). 使用场合1:从派生类转换为基类,向上转型
class Animal {}
class Cat: Animal {}
let cat = Cat()
let animal = cat as Animal
(2). 使用场合2:数值类型转换----消除二义性
let num1 = 42 as CGFloat
let num2 = 42 as Int
let num4 = (42 / 2) as Double
(3). 使用场合3:switch
语句中进行模式匹配
//如果不知道一个对象是什么类型,你可以通过switch语法检测它的类型,并且尝试在不同的情况下使用对应的类型进行相应的处理。
switch animal {
case let cat as Cat:
print("如果是Cat类型对象,则做相应处理")
case let dog as Dog:
print("如果是Dog类型对象,则做相应处理")
default: break
}
- as!
强制类型转换,向下转型(
Downcasting
)时使用,如果转换失败会报runtime
运行错误。官方解释说这是一个不被保证的转换,可能会因为强转的失败而会导致崩溃。同时
!
是一个陷阱的标志,就像⚠️一样,用起来存在一定危险性。
class Animal {}
class Cat: Animal {}
let animal :Animal = Cat()
let cat = animal as! Cat
- as?
as?
和as!
操作符的转换规则完全一样。但as?
如果转换不成功的时候便会返回一个nil
对象。成功的话返回可选类型值(optional
)
由于as?
在转换失败的时候也不会出现错误,所以对于如果能确保100%会成功的转换则可使用as!
,否则使用as?
let animal:Animal = Cat()
if let cat = animal as? Cat{
print("cat is not nil")
} else {
print("cat is nil")
}