前言:向一個(gè)對象發(fā)出詢問文黎,以確定它是不是屬于某個(gè)類惹苗,這種操作就稱為自省。前段時(shí)間使用 Swift 時(shí)常遇到一個(gè)判斷對象屬于哪個(gè)類的情況耸峭,使用 Objective-C 的語法沒有解決桩蓉,于是就找了度娘終于解決了問題。正所謂好東西大家一起分享才會最大化體現(xiàn)出該好東西的價(jià)值劳闹,今天值此機(jī)會給大家分享一下我總結(jié)的內(nèi)容院究。
首先來看一下在 Objective-C 中常用的判斷一個(gè)對象是屬于哪個(gè)類的方法有下面兩類:
[obj1 isKindOfClass:[ClassA class]];
[obj2 isMemberOfClass:[ClassB class]];
-isKindOfClass:
判斷obj1
是否是ClassA
或者其子類的實(shí)例對象;
-isMemberOfClass:
對obj2
做出判斷本涕,當(dāng)且僅當(dāng)obj2
的類型為ClassB
時(shí)返回為真业汰。
以上這兩個(gè)方法是NSObject
的方法,所以我們在 Swift 中如果寫的是NSObject
的子類的話菩颖,直接使用這兩個(gè)方法是沒有任何問題的样漆,如下:
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 中提供了一個(gè)更簡潔的寫法:對于一個(gè)不確定的類型,我們可以使用is
來進(jìn)行判斷晦闰。is
在功能上相當(dāng)于原來的isKindOfClass
放祟,可以檢查一個(gè)對象是否屬于某類型或其子類型。is
和原來的區(qū)別主要在于它不僅可以用于class
類型上鹅髓,也可以對 Swift 的其他像是struct
或enum
類型進(jìn)行判斷舞竿。如下:
class ClassA { }
class ClassB: ClassA { }
let obj: AnyObject = ClassB()
if (obj is ClassA) {
print("obj 屬于 ClassA")
}
if (obj is ClassB) {
print("obj 屬于 ClassB")
}
另外,編譯器將對這種檢查進(jìn)行必要性的判斷:如果編譯器能夠唯一確定類型窿冯,那么is
的判斷就沒有必要骗奖,編譯器將會拋出一個(gè)警告,來提示你并沒有轉(zhuǎn)換的必要醒串。如下:
let string = "String"
if string is String {
//
}
OK执桌,到此結(jié)束了。內(nèi)容不是很多芜赌,不過還是希望能夠幫助到有需要的朋友仰挣。愿我們能夠共同學(xué)習(xí)進(jìn)步,在開發(fā)的道路上越走越遠(yuǎn)缠沈!謝謝膘壶!