iOS技术分享程序员iOS Developer

Swift-自省(判断对象属于什么)

2017-08-23  本文已影响672人  it_hao528
我是谁.jpeg

前言:向一个对象发出询问,以确定它是不是属于某个类,这种操作就称为自省。前段时间使用 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 的其他像是structenum类型进行判断。如下:

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,到此结束了。内容不是很多,不过还是希望能够帮助到有需要的朋友。愿我们能够共同学习进步,在开发的道路上越走越远!谢谢!

上一篇 下一篇

猜你喜欢

热点阅读