Swift 獲取對象類型,對象類型轉(zhuǎn)換成字符串替換OC中NSStringFromClass

在 Objective-C 中我們可以輕而易舉地做到這件事,使用 -class 方法就可以拿到對象的類,我們甚至可以用 NSStringFromClass 將它轉(zhuǎn)換為一個能夠打印出來的字符串:

NSDictionary *dic = [NSDictionary new];
NSLog(@"%@",NSStringFromClass([dic class]));
// 輸出:
// __NSDictionary

在 Swift 中,我們會發(fā)現(xiàn)不管是純 Swift 的 class 還是 NSObject 的子類,都沒有像原來那樣的 class() 方法來獲取類型了。對于 NSObject 的子類,因為其實類的信息的存儲方式并沒有發(fā)生什么大的變化,因此我們可以求助于 Objective-C 的運行時,來獲取類并按照原來的方式轉(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 是一個定義在 ObjectiveC 的 runtime 中的方法,它可以接受任意的 AnyObject! 并返回它的類型 AnyClass! (注意這里的嘆號,它表明我們甚至可以輸入 nil,并期待其返回一個 nil)。在 Swift 中其實為了獲取一個 NSObject 或其子類的對象的實際類型,對這個調(diào)用其實有一個好看一些的寫法,那就是 dynamicType。上面的代碼用一種 "更 Swift" 一些的語言轉(zhuǎn)換一下,會是這個樣子:

let dic = NSDictionary()
let name = type(of:dic)
print(name)
// 輸出:
// __NSDictionary

很好,似乎我們的問題能解決了。但是仔細(xì)想想,我們上面用的都是 Objective-C 的動態(tài)特性,要是換成一個 Swift 內(nèi)建類型的話,會怎么樣呢?比如原生的 String,

let string = "Hello"
let name = type(of:string)
print(name)
// 輸出:
// String
//轉(zhuǎn)成字符串與相同

可以看到對于 Swift 的原生類型,這種方式也是可行的

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容