as
as运算符用于将实例转换为另一种类型。这可用于转换可互换的类型或将 Swift 类型转换为 oc类型,反之也是一样的。
swift 自身类型的转换
class Person {
var age: Int = 0
var name: String = ""
}
class Male : Person111{}
class Female: Person111 {}
let p = person as Person //
let m = person as Male //'Person' is not convertible to 'Male'; did you mean to use 'as!' to force downcast?
注意: 如果左边的实例的类型是右边类型的父类,那么单单使用as会有报错提示!as不可以用于父类转子类,因此代码提示可以使用as!(强转)
let error = 0.0 as Int //Cannot convert value of type 'Double' to type 'Int' in coercion
Swift 与 OC 类型 的转换
let ocString = "asd" as NSString
let ocURL = URL(string: "") as NSURL?
let ocArray = [] as NSArray
let ocDictionary = [:] as NSDictionary
...
as?
as? 它允许您检查一种类型的对象是否可以转换为另一种类型。如果转换成功,则返回转换后的值,否则返回nil。
let m = person as? Male
as!
as! 强制解开该值。仅当您绝对确定有值时不会失败时才能够使用。否则它将导致崩溃。
let a = person as! Anmail
如上面的类型转换将会崩溃,因为我们将Person 类型转换为Anmail
let crashes = 0.0 as! Int//Cast from 'Double' to unrelated type 'Int' always fails
is
is运算符用于检查实例的类型。
for perosn in persons {
if perosn is Male{
print("perosn is C Male")
}
}
is 和 isKindOfClass() 的区别
is在任何swift类,而isKindOfClass()只能与那些是NSObject的子类或以用其它方式实现NSObjectProtocol的类中。is适用于非类类型。isKindOfClass:仅适用于对象以检查它们是否是类的实例isKindOfClass:在NSObjectProtocol的声明上,因此它不会让您在该协议中未知的表达式上使用它,除了AnyObject。 实际上,Swift 类也(非正式地)符合NSObjectProtocol,因此如果您将它们强制转换为AnyObject,您仍然可以使用isKindOfClass:(something as AnyObject).isKindOfClass(MyClass)is还可以检查协议,而NSObjectProtocol方法方面的等效项是conformsToProtocol:is采用必须在编译时硬编码的类型。isKindOfClass:采用一个表达式,其值可以在运行时计算。我不知道有什么方法可以检查对象是否是在运行时仅使用 Swift 标准库计算的类(包括子类)的实例。