• Swift补基础之Selector、条件编译、编译标记、NSObject


    在swift中使用条件编译比较直接
    #if <condition>
    
    #elseif <condition>
    
    #else
    
    #endif

    例如 :在debug模式和release模式编译不同代码

    #if DEBUG
    
    #else
    
    #endif

    在swift中判断iOS版本是否可用 更简单啦

    //#available(iOS 8, *)
    //数字随便改啦
    if  #available(iOS 9.0, *) {
     //如果是9.0 或者以上
    }else{
    
    }
    编辑标记

    在swift中支持几种编译标记

       //FIXME: 请修正此方法
        private func x1() {
            print("x1")
        }
    
        //MARK: -这个是正确的
        @objc private func x2() {
            print("x2")
        }
    
        //TODO: - 以后要做的先标记
        func todoMethod(){
    
        }

    加了这种标记后 找起来就方便多了


    编译标记
    Selector

    Selector可以将一个方法转换并赋值给一个 SEL
    类型,它的表现很类似一个动态的函数指针。在 objc 时 selector 非常常用,从设定 target-action,到自举询问是否响应某个方法,再到指定接受通知时需要调用的方法等等,都是由 selector 来负责的。

    下面看看Selector基本用法

        func x(){
            print("x")
        }
    
        func y(n:NSNumber){  //(一个小坑)这里不能用基础类型 int float之类的   不是AnyObject
            print("y = (n)")
        }
    
        //MARK: - 测试z方法
        func z(n:NSNumber,m:NSNumber){
            print("z = (n) , (m)")
        }
    
        //FIXME: 请修正此方法
        private func x1() {
            print("x1")
        }
    
        //MARK: -这个是正确的
        @objc private func x2() {
            print("x2")
        }

    这里搞了几个方法,看看怎么用

            let sel = NSSelectorFromString("x")
            let meth1 = Selector("x")
            let meth2 = Selector("y:")   //一个参数
            let meth3 = Selector("z:m:")  //多个参数
    //      selector 其实是 objc runtime 的概念,如果这个你的 selector 对应的方法只在 Swift 中可见的话 (也就是说它是一个 Swift 中的 private 方法),在调用这个 selector 时你会遇到一个 unrecognized selector 错误:
            //所以要在private方法前面加@objc
            let meth4 = Selector("x2")

    两种方式 都是可以的

    你有很多种调用的方式 看需求了

            self.performSelector(meth1)
            self.performSelector(meth2,withObject: 2)
            self.performSelector(meth3,withObject: 2,withObject: 12)
            self.performSelector(meth4)
            NSThread.detachNewThreadSelector(meth2, toTarget: self, withObject: 3333)
            if self.respondsToSelector(sel){
                 self.performSelector(sel)
            }
            self.performSelector(meth2, withObject: 24, afterDelay: 2)//延时执行
    NSObject

    在swift中大多数类都继承自NSObject 看下有哪些基础操作

    下面的测试都是在ViewController的viewDidLoad方法中测试的,可以直接无痛看注释

            print(self.isKindOfClass(NSObject))  //true    测试一个接收器是否是一个指定类的实例
            print(self.isMemberOfClass(NSObject)) //false   从属关系
            print(self.isMemberOfClass(ViewController)) // true
            print(self.respondsToSelector(sel))  //true  是否实现了一个指定的方法
            print(self.conformsToProtocol(UITableViewDelegate)) //false    是否实现了某个协议
            print(self.isEqual(ViewController())) //false 对象比较
            print(self.description)   //<DynimicTest.ViewController: 0x7fac48c377b0> 允许一个对象返回一个字符串来描述它的内容



    文/大石头布(简书作者)
    原文链接:http://www.jianshu.com/p/042fa8348c14
    著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。
  • 相关阅读:
    通过PHP类的反射来实现依赖注入
    hyperf 基础篇
    composer install 遇到 lock 文件 warning
    laravel carbon 怎么计算两个时间的差?
    laravel 属性类型转换$casts
    Java Web安全之代码审计
    【代码审计】————2、aspx代码审计-2
    【代码审计】————1、aspx代码审计-1
    【逻辑漏洞技巧拓展】————9、业务逻辑漏洞探索之上传漏洞
    【逻辑漏洞技巧拓展】————8、业务逻辑漏洞探索之敏感信息泄露
  • 原文地址:https://www.cnblogs.com/Free-Thinker/p/5355718.html
Copyright © 2020-2023  润新知