Swift Runtime 练手之二 NSURL黑魔法

感谢朋友MG明明 http://www.jianshu.com/u/57b58a39b70e 的指点,因为我是SWIFT直接入门,OC上写的runtime语法都不知如何移到SWIFT里应用,有个好友指点,确实可以少走很多弯路!

此篇就直接上代码了,原理请看上一篇!

NSURL黑魔法
因为URL不能使用RunTime 因为URL是Struct结构体 ,而NSURL是Class类 集成NSObject ,所以要调用 NSURL来判断网址是否为空

 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
    }
    
    //交换方法函数
    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没有实现IMP的情况
        let didAddMethod =  class_addMethod(cls, origSEL,
                                            method_getImplementation(swizzleMethod),
                                            method_getTypeEncoding(swizzleMethod))
        
        if didAddMethod {
            //添加成功:说明源SEL没有实现IMP,将源SEL的IMP替换到交换SEL的IMP
            class_replaceMethod(cls, newSEL,
                                method_getImplementation(originalMethod),
                                method_getTypeEncoding(originalMethod))
            
        }else {
            //添加失败:说明源SEL已经有IMP,直接将两个SEL的IMP交换即可
            method_exchangeImplementations(originalMethod, swizzleMethod)
        }
        
    }

    
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容