类型判断(is)
还记OC中有下面这么一个方法么?
[path isKindOfClass:[NSString class]]; //判断,一个对象是否属于一个类,返回值是一个BOOL类型
然而Swift中并没有这个方法,取而代之的是is这个关键字,它能判断的不仅是对象,还可以判断基本数据类型等等,如下
例:
if number is Int { //判断一个变量是否是Int类型,返回值是一个Bool类型
print(number)
}
if view is UIView { //判断一个对象是否属于一个类,返回值是一个Bool类型
view.frame = CGRectMake(100, 100, 100, 100)
}
Tips:BOOL与Bool
BOOL:是OC中的类型,取值为YES或NO,但其本质为整型
Bool:是Swift中的类型,取值为ture或false,这两个关键字是真正的真与假,并不是Int类型(ture/false与YES/NO在内存中所占字节数是不同的)
类型转换(as)
"as"的作用是将NSObject转换为具体类型(对一个实例进行类型转换)
- as?
将NSObject转换成一个可选类型,可能转成功也可能不成功,如果成功则转换为?后面的类型,如果不成功就还是NSObject类型,也就是说接收转换值的变量也应该是一个可选类型
例1:
let infoDic = ["name" : "lyu" , "age" : 18] //此时,字典存储的vale值为NSObject类型
let name : String? = infoDic["name"] as? String //将NSObject转换成为Optional<string>类型
let length : Int? = name?.characters.count //做好类型转换后,就可以调用characters方法,从而计算出字符串长度,
//let length : Int = name!.characters.count //另外,此时我明确的知道name的值不是nil,所以也可以将上一句的name?改为name!,不过不建议这么做
print(length!) //解包
} //结果:控制台打印3
例2:
let infoDic = ["name" : "lyu" , "age" : 18] //此时,字典存储的vale值为NSObject类型
let name : String? = infoDic["age"] as? String //将NSObject转换成为Option<String>类型,实际上age的值是Int类型,所以此时并不能转换成功,但不会崩溃,而是返回nil
//let length : Int = name!.characters.count //这句代码是会导致运行时崩溃的,因为name此时是一个nil,没办法强制解包哦,这就是例1中引入可选链的原因
let length : Int? = name?.characters.count //此时name的值为nil
print(length) //你知道这个时候length实际上是nil的对吧?千万不要强制解包哦(length!),结果:控制台打印nil
- as!
将NSObject转换成一个具体类型,如果不成功直接崩溃
例:
let infoDic = ["name" : "lyu" , "age" : 18] //此时,字典存储的vale值为NSObject类型
let name : String = infoDic["name"] as! String //将NSObject转换成为String类型(具体类型)
let length : Int = name.characters.count //做好类型转换后,就可以调用characters方法,从而计算出字符串长度(具体类型)
print(length) //无需解包,打印结果为3
但是下面这段代码会导致运行时崩溃:
let name : String = infoDic["age"] as! String //这是因为age的值本身为为Int类型,无法转换为String类型,as!语法强制它为String类型的话,那么系统只好崩溃了
- as嵌套在可选绑定中的几种写法
- 写法1:
let infoDic = ["name" : "lyu" , "age" : 18]
if let value = infoDic["name"] { //解包
if let name = value as? String { //类型转换
print(name)
}
}
- 写法2:
let infoDic = ["name" : "lyu" , "age" : 18]
if let name = infoDic["name"] as? String { //解包同时类型转换
print(name)
}