前言:向一个对象发出询问,以确定它是不是属于某个类,这种操作就称为自省。前段时间使用 Swift 时常遇到一个判断对象属于哪个类的情况,使用 Objective-C 的语法没有解决,于是就找了度娘终于解决了问题。正所谓好东西大家一起分享才会最大化体现出该好东西的价值,今天值此机会给大家分享一下我总结的内容。
首先来看一下在 Objective-C 中常用的判断一个对象是属于哪个类的方法有下面两类:
[obj1 isKindOfClass:[ClassA class]];
[obj2 isMemberOfClass:[ClassB class]];
-isKindOfClass:
判断obj1
是否是ClassA
或者其子类的实例对象;
-isMemberOfClass:
对obj2
做出判断,当且仅当obj2
的类型为ClassB
时返回为真。
以上这两个方法是NSObject
的方法,所以我们在 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
在 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 {
//
}
OK,到此结束了。内容不是很多,不过还是希望能够帮助到有需要的朋友。愿我们能够共同学习进步,在开发的道路上越走越远!谢谢!
网友评论