isKind 用来判断该对象是否为指定类或者指定类的子类的对象;而isMember 用来判断该对象是否为指定类的对象
这两个方法是 NSObject 的方法,所以我们在 Swift 中如果写的是 NSObject 的子类的话,直接使用这两个方法是没有任何问题的:
class ClassA: NSObject { }
class ClassB: ClassA { }
let obj1 = ClassB()
let obj2 = ClassB()
obj1.isKind(of: ClassA.self) // true
obj2.isMember(of: ClassA.self) // false
在 Objective-C 中几乎所有的类都会是 NSObject 的子类,而在 Swift中如果类不是NSObject的子类时,怎么确定其类型呢?
class ClassA { }
class ClassB: ClassA { }
let obj1: AnyObject = ClassB()
let obj2: AnyObject = ClassB()
obj1.isKind(of: ClassA.self) // true
obj2.isMember(of: ClassA.self) // false
为了快速确定类型,Swift 提供了一个简洁的写法:对于一个不确定的类型,我们现在可以使用 is 来进行判断。is在功能上相当于isKind,
不同的是它不仅可以用于class类型上,也可以用于Swift的其他类型,如struct活enum上
另外,编译器将对这种检查进行必要性的判断:如果编译器能够唯一确定类型,那么 is 的判断就没有必要,编译器将会抛出一个警告,来提示你并没有转换的必要。
let string = "String"
if string is String {
// Do something
}
// 'is' test is always true