1.Objective-C 中常用的判断一个对象是属于哪个类的方法有下面两类:

[obj1 isKindOfClass:[ClassA class]];
[obj2 isMemberOfClass:[ClassB class]];


结论:

​-isKindOfClass:​​ 判断​​obj1​​是否是​​ClassA​​或者其子类的实例对象;

​-isMemberOfClass:​​ 对​​obj2​​做出判断,当且仅当​​obj2​​的类型为​​ClassB​​时返回为真

在 Swift 中如果写的是​​NSObject​​的子类的话

class ClassA: NSObject { }
class ClassB: ClassA { }

let obj1: NSObject = ClassB()
let obj2: NSObject = ClassB()

obj1.isKindOfClass(ClassA.self) // true
obj2.isMemberOfClass(ClassA.self) // false


2.在 Swift 中提供了一个更简洁的写法:对于一个不确定的类型,我们可以使用​​is​​​来进行判断。​​is​​​在功能上相当于原来的​​isKindOfClass​​​,可以检查一个对象是否属于某类型或其子类型。​​is​​​和原来的区别主要在于它不仅可以用于​​class​​​类型上,也可以对 Swift 的其他像是​​struct​​​或​​enum​​类型进行判断。如下:

class ClassA { }
class ClassB: ClassA { }

let obj: AnyObject = ClassB()

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

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


另外,编译器将对这种检查进行必要性的判断:如果编译器能够唯一确定类型,那么​​is​​的判断就没有必要,编译器将会抛出一个警告,来提示你并没有转换的必要。如下:

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



liming