zoukankan      html  css  js  c++  java
  • Swift 属性与汇编分析inout本质

    今天将讲述Swift属性以及剖析inout的本质, 如有兴趣可点击关注,以后会定期更新更有料的博客!!!

    一、属性 

    Swift中跟实例相关的属性可以分为2大类

    1. 存储属性(Stored property)
    • 类似于成员变量这个概念
    • 存储在实例的内存中
    • 结构体、类可以定义存储属性
    • 枚举不可以定义存储属性

      2.  计算属性(Computed Property)

    • 本质就是方法(函数)
    • 不占用实例的内存
    • 枚举、结构体、类都可以定义计算属性
    struct Circle {
        //存储属性
        var radius: Double
        //计算属性
        var diameter: Double {
            set{
               radius = newValue / 2
            }
            get{
                radius * 2
            }
        }
    }

    1. 存储属性

    将针对例子讲解上面的结论

     将结构体Struct改为类Class,如下

     解释下为什么枚举Enum不可以定义存储属性?

    2. 计算属性

     上面说到计算属性相当于函数方法的意思如下,前后两者完全等价

     总结

    存储属性: 关于存储属性,Swift有个明确的规定

    • 创建类或者结构体时, 必须为所有的存储属性设置一个合适的初始值
    • 可以在初始化器内为存储属性设置一个初始值,也可以分配一个默认的属性值作为属性定义的一部分

    计算属性: set传入的新值默认为newValue,也可以自定义

    • 只读计算属性: 只有get,没有set
    • 可读可写属性
    • 没有只写属性,单独一个set方法是不可以的

    枚举的原始值rawValue的本质是只读计算属性

    3. 延迟存储属性(Lazy Stored Property)

    使用lazy可以定义一个延迟存储属性, 在第一次用到属性的时候才会进行初始化

    4. 属性观察器(Property Observer)

    可以为非lazyvar存储属性设置属性观察器,也是存储属性

     注意: 在初始化器中设置属性值不会触发willSet和didSet方法!!!

    二、inout本质

    inout:输入输出参数的本质就是引用传递(地址传递)

    通过inout查看汇编代码:leap命令: 将地址传入进去

     inout本质总结:

    如果实参有物理内存地址且没有设置属性观察器:直接将实参的内存地址传入函数(实参进行引用传递)

    如果实参是计算属性 或者 设置了属性观测器:采取了苹果官方说的 Copy In Copy Out的做法

    1. 调用该函数时,先复制实参的值,产生局部变量副本(相当于get)
    2. 将副本的内存地址传入函数(副本进行引用传递),在函数内部可以修改副本的值
    3. 函数返回后,再将副本的值覆盖实参的值
  • 相关阅读:
    php js表单登陆验证
    jQuery Ajax 简单的实现跨域请求
    常见http代码错误原因及处理
    使用git做服务器端代码的部署
    mysql之消息队列
    MySQL触发器使用详解
    mysql之触发器before和after的区别
    mysql之触发器trigger
    手把手教你使用Git
    xcode: {} 花括号缩进一个空格
  • 原文地址:https://www.cnblogs.com/guohai-stronger/p/12449458.html
Copyright © 2011-2022 走看看