zoukankan      html  css  js  c++  java
  • Swift中self和Self

    Self相当于oc中的instance

    是什么

    相信大家都知道self这个关键字的具体作用,它跟OC里的self基本一样。但是对于Self来说...(WTF,这是什么东西)
    当你用错Self的时候编译器会这样提示

    'Self' is only available in a protocol or as the result of a method in a class
    

    分割开来的话就是两个意思
    1.Self可以用于协议(protocol)中限制相关的类型
    2.Self可以用于类(Class)中来充当方法的返回值类型

    为什么

    对于第一种情况,可以参考书中的例子

    protocol Copyable {
        func copy() -> Self
        func clamp(intervalToClamp: Self) -> Self
    }
    

    在这个协议中的两个方法都用Self来对类型进行限制

    第二种情况可以参考下面这个例子

    class A: Copyable {
        var num = 1
        
        required init() {
            
        }
        
        func copy() -> Self {
            let type = type(of: self)
            print(type)
            let result = type.init()
            result.num = num
            return result
        }
        
        func clamp(intervalToClamp: A) -> Self {
            let result = type(of: self).init()
            result.num = num
            return result
        }
        
        class func calssFunc() -> Self {
            let type = self
            print(type)
            let result = type.init()
            return result
        }
        
    }
    
    class B: A {
        func clamp(intervalToClamp: B) -> Self {
            let result = type(of: self).init()
            result.num = num
            return result
        }
    }
    
    let type = A.self
    type.calssFunc()
    
    let typeB = B.self
    typeB.calssFunc()
    
    let objectA = A()
    objectA.num = 100
    
    let newObjectA = objectA.copy()
    objectA.num = 1
    
    let objectB = B()
    objectB.num = 100
    let newB = objectB.copy()
    

    这个例子中有两个类A和B,A实现了协议中的两个方法并包含一个类方法,B是A的子类,它也实现了协议的方法。
    可以看到对于A来说
    A的实例方法中self表示当前实例,利用type(of: self)获取当前对象的类型,
    A的类方法中self就表示当前类的类型,而Self则只能用来表示返回值的类型。
    对比A和B所实现的协议的方法可以看出在协议中的方法接收的参数类型必须换成各自类的类型,否则会报文章开头的那个错误。

    怎么用

    综上可看出对于Self来说它只是表示特定类型,并且只能用在协议中或者作为某个类的方法的返回值类型,而self在实例方法中代指当前实例,在类方法中则代指当前类。



    作者:周二可
    链接:https://www.jianshu.com/p/5059d2993509
    來源:简书
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  • 相关阅读:
    linux 总结一下git reset的各个选项吧
    深入C++的new
    Android中binderDied()以及"Unknown binder error code" 出现的原因说明
    C/C++语言void及void指针深层探索
    Android 不通过USB数据线调试的方法
    Android Browser Gallery3D无法两指手势缩放
    Android eMMC Booting
    android基础知识13:AndroidManifest.xml文件解析
    Package sunjava6jdk is not available Ubuntu 10.04 LTS 安装sunjava6jdk ,出现错误
    SQL Server 2008中Service Broker基础应用(上)
  • 原文地址:https://www.cnblogs.com/feng9exe/p/9092357.html
Copyright © 2011-2022 走看看