Swift中isKind、is、isMember的区别和理解

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

你可能感兴趣的:(Swift中isKind、is、isMember的区别和理解)