感謝朋友MG明明 http://www.itdecent.cn/u/57b58a39b70e 的指點(diǎn),因?yàn)槲沂荢WIFT直接入門,OC上寫的runtime語(yǔ)法都不知如何移到SWIFT里應(yīng)用,有個(gè)好友指點(diǎn),確實(shí)可以少走很多彎路!
此篇就直接上代碼了,原理請(qǐng)看上一篇!
NSURL黑魔法
因?yàn)閁RL不能使用RunTime 因?yàn)閁RL是Struct結(jié)構(gòu)體 ,而NSURL是Class類 集成NSObject ,所以要調(diào)用 NSURL來(lái)判斷網(wǎng)址是否為空
let urlString = "http://www.163.com/中文"
override func viewDidLoad() {
super.viewDidLoad()
let url = NSURL(string: urlString)
print (url!)
}
// URL為空
// nil
extension NSURL {
open override static func initialize() {
super.initialize()
self.mySwizzle(cls: NSURL.self, origSEL: #selector(NSURL.init(string:)), newSEL: #selector(NSURL.newNSURL(withstr:)))
}
func newNSURL(withstr:String) -> NSURL?{
let url = newNSURL(withstr:withstr)
if url == nil {
print ("URL為空")
}
return url
}
//交換方法函數(shù)
class func mySwizzle(cls:AnyClass,origSEL:Selector,newSEL:Selector){
//原有方法
let originalMethod:Method = class_getInstanceMethod(cls, origSEL)
//新方法(替換原有方法的新方法)
let swizzleMethod:Method = class_getInstanceMethod(cls, newSEL)
//先嘗試給源SEL添加IMP,這里是為了避免源SEL沒有實(shí)現(xiàn)IMP的情況
let didAddMethod = class_addMethod(cls, origSEL,
method_getImplementation(swizzleMethod),
method_getTypeEncoding(swizzleMethod))
if didAddMethod {
//添加成功:說(shuō)明源SEL沒有實(shí)現(xiàn)IMP,將源SEL的IMP替換到交換SEL的IMP
class_replaceMethod(cls, newSEL,
method_getImplementation(originalMethod),
method_getTypeEncoding(originalMethod))
}else {
//添加失?。赫f(shuō)明源SEL已經(jīng)有IMP,直接將兩個(gè)SEL的IMP交換即可
method_exchangeImplementations(originalMethod, swizzleMethod)
}
}
}