什么是反射機(jī)制
- 對于任意一個(gè)類,都能夠知道這個(gè)類的所有屬性和方法
- 對于任意一個(gè)對象,都可以調(diào)用它的任意一個(gè)方法和屬性
- 這種動(dòng)態(tài)獲取的信息以及動(dòng)態(tài)調(diào)用對象方法的功能叫做 Java 語言的反射機(jī)制
在 OC 中的反射機(jī)制
- 利用 NSClassFromString 方法來使用字符串獲取類
- 利用 isMemberOfClass: 判斷是否是某一個(gè)類
- 利用 isKindOfClass 判斷是否是某個(gè)類的子類
- 利用 conformsToProtocol 判斷對象是否遵守某個(gè)協(xié)議
- 利用 respondsToSelector 判斷是否實(shí)現(xiàn)了某個(gè)方法
- 利用 performSelector 或者 objc_msgSend 間接調(diào)用方法
Swift 中的反射機(jī)制
對于反射機(jī)制的好處莺琳,最主要的一個(gè)就是解耦柱锹,可以更好的把功能封裝起來
在 Swift 中剩拢,類似與 NSClassFromString 的寫法渔伯,由于 Swift 引入了命名空間的概念,所以在獲取對應(yīng)類的時(shí)候尿褪,需要傳入命名空間睦擂。
獲取項(xiàng)目的命名空間:
Bundle.main.infoDictionary?["CFBundleName"]
可以利用 extension 把獲取命名空間的封裝起來
1.對象方法
extension Bundle{
func namespace() -> String {
//返回命名空間
return infoDictionary?["CFBundleName"] as? String ?? ""
}
}
//調(diào)用
let name = Bundle.main.namespace()
2.計(jì)算型屬性
extension Bundle{
var namespace:String {
return infoDictionary?["CFBundleName"] as? String ?? ""
}
}
//調(diào)用
let name = Bundle.main.namespace
這樣實(shí)現(xiàn)調(diào)用起來比較方便