陈斌彬的技术博客

Stay foolish,stay hungry

Swift 中的 Is

在 Swift 中对于 AnyObject 使用最多的地方应该就是原来那些返回 id 的 Cocoa API 了。

为了快速确定类型,Swift 提供了一个简洁的写法:对于一个不确定的类型,我们现在可以使用 is 来进行判断。is 在功能上相当于原来的 isKindOfClass,可以检查一个对象是否属于某类型或其子类型。is 和原来的区别主要在于亮点,首先它不仅可以用于 class 类型上,也可以对 Swift 的其他像是 struct 或 enum 类型进行判断。使用起来是这个样子的:

class ClassA { }
class ClassB: ClassA { }

let obj: AnyObject = ClassB()

if (obj is ClassA) {
    println("属于 ClassA")
}

if (obj is ClassB) {
    println("属于 ClassB")
}

另外,编译器将对这种检查进行必要性的判断:如果编译器能够唯一确定类型,那么 is 的判断就没有必要,编译器将会抛出一个错误,类似这样的代码时无法通过编译的:

let string = "String"
if string is String {
    // Do something
}

// 'is' test is always true

Resource Reference