Swift 关键词系列 ——— as / is

669 阅读2分钟

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")
   }
}

isisKindOfClass() 的区别

  • 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 标准库计算的类(包括子类)的实例。