Swift Runtime 練手之二 NSURL黑魔法

感謝朋友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)
        }
        
    }

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

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

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