在 Objective-C 中我們可以輕而易舉地做到這件事,使用 -class 方法就可以拿到對(duì)象的類,我們甚至可以用 NSStringFromClass 將它轉(zhuǎn)換為一個(gè)能夠打印出來(lái)的字符串:
NSDictionary *dic = [NSDictionary new];
NSLog(@"%@",NSStringFromClass([dic class]));
// 輸出:
// __NSDictionary
在 Swift 中,我們會(huì)發(fā)現(xiàn)不管是純 Swift 的 class 還是 NSObject 的子類,都沒(méi)有像原來(lái)那樣的 class() 方法來(lái)獲取類型了。對(duì)于 NSObject 的子類,因?yàn)槠鋵?shí)類的信息的存儲(chǔ)方式并沒(méi)有發(fā)生什么大的變化,因此我們可以求助于 Objective-C 的運(yùn)行時(shí),來(lái)獲取類并按照原來(lái)的方式轉(zhuǎn)換:
let dic = NSDictionary()
let name: AnyClass! = object_getClass(dic)
//如果需要將類型轉(zhuǎn)換成字符串加上下一句
let className = String(describing: name!)
print(name)
print(className)
// 輸出:
// __NSDictionary====>這里輸出的AnyClass
// __NSDictionary====>這里輸出的是字符串
其中 object_getClass 是一個(gè)定義在 ObjectiveC 的 runtime 中的方法,它可以接受任意的 AnyObject! 并返回它的類型 AnyClass! (注意這里的嘆號(hào),它表明我們甚至可以輸入 nil,并期待其返回一個(gè) nil)。在 Swift 中其實(shí)為了獲取一個(gè) NSObject 或其子類的對(duì)象的實(shí)際類型,對(duì)這個(gè)調(diào)用其實(shí)有一個(gè)好看一些的寫(xiě)法,那就是 dynamicType。上面的代碼用一種 "更 Swift" 一些的語(yǔ)言轉(zhuǎn)換一下,會(huì)是這個(gè)樣子:
let dic = NSDictionary()
let name = type(of:dic)
print(name)
// 輸出:
// __NSDictionary
很好,似乎我們的問(wèn)題能解決了。但是仔細(xì)想想,我們上面用的都是 Objective-C 的動(dòng)態(tài)特性,要是換成一個(gè) Swift 內(nèi)建類型的話,會(huì)怎么樣呢?比如原生的 String,
let string = "Hello"
let name = type(of:string)
print(name)
// 輸出:
// String
//轉(zhuǎn)成字符串與相同
可以看到對(duì)于 Swift 的原生類型,這種方式也是可行的