• 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
    來源:简书
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  • 相关阅读:
    idea中yml文件变成text样式并且没有提示
    挂载redhat镜像创建本地yum源
    Windows环境下Oracle数据库的自动备份脚本
    Oracle存储过程锁表
    DDL和客户端ip监控
    Linux 单实例oracle安装步骤
    Linux常用命令
    Linux常用目录
    oracle基础知识及语法
    Linux下Oracle新建用户并且将已有的数据dmp文件导入到新建的用户下的操作流程
  • 原文地址:https://www.cnblogs.com/feng9exe/p/9092357.html
Copyright © 2020-2023  润新知