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

一、属性

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

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

  2.  计算属性(Computed Property)

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

1. 存储属性

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

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

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

2. 计算属性

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

总结

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

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

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

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

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

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

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

4. 属性观察器(Property Observer)

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

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

二、inout本质

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

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

 inout本质总结:

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

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

  1. 调用该函数时,先复制实参的值,产生局部变量副本(相当于get)
  2. 将副本的内存地址传入函数(副本进行引用传递),在函数内部可以修改副本的值
  3. 函数返回后,再将副本的值覆盖实参的值

Swfit 属性与汇编分析inout本质的更多相关文章

  1. Swift系列七 - 汇编分析值类型

    通过汇编分下值类型的本质. 一.值类型 值类型赋值给var,let或者给参数传参,是直接将所有内容拷贝一份.类似于对文件进行复制粘贴操作,产生了全新的文件副本,属于深拷贝(deep copy). 示例 ...

  2. GDB调试汇编分析

    GDB调试汇编分析 代码 本次实践我参照了许多先做了的同学的博客,有卢肖明,高其,张梓靖同学.代码借用的是卢肖明同学的代码进行调试运行. GCC编译 使用gcc -g gdbtest.c -o gdb ...

  3. 20145233 GDB调试汇编分析

    GDB调试汇编分析 代码 #include<stdio.h> short addend1 = 1; static int addend2 = 2; const static long ad ...

  4. Keil开发的ARM程序main函数之前的汇编分析

    Keil开发的ARM程序main函数之前的汇编分析 ——BIN文件中RW段的数据移动 系统平台: STM32系列STM32F103ZE,512KB内部FLASH,64KB片内存储; FLASH地址范围 ...

  5. 高级C代码的汇编分析

    在windows上,常用的函数调用方式有: Pascal方式,WINAPI(_stdcall)方式 和C方式(_cdecl) _cdecl调用规则: 1,参数从右到左入堆栈 2,在函数返回后,调用者要 ...

  6. VC++代码的汇编分析(一)

    VC++代码是最接近汇编指令的高级语言,为了更加准确和深刻理解VC++编码中所涉及的很多技术概念和编译器参数的含义,从汇编指令层面进行剖析和解读,有助于开发者更加准确.直观.深刻理解高级语言中很多概念 ...

  7. STM32F10x的启动汇编分析

    ;******************** (C) COPYRIGHT 2009 STMicroelectronics ********************;* File Name         ...

  8. SDL获得屏幕属性及实现分析

    [时间:2017-05] [状态:Open] [关键词:sdl2,屏幕分辨率,显示区域,多媒体渲染,窗口,sdl2源码分析] 0 引言 本文的主要目标在于使用SDL2获得屏幕相关的属性,比如分辨率.屏 ...

  9. AbstractBeanDefinition:lenientConstructorResolution属性源码分析

    版本:spring-framework-4.1 一概述 在看AbstractBeanDefinition源码时,注意到lenientConstructorResolution属性有诸多不疑,现在通过示 ...

随机推荐

  1. plsql中文显示问号

    1. select userenv('language') from dual 2. 复制查询的值配置系统环境变量 NLS_LANG=AMERICAN_AMERICA.ZHS16GBK 3.配置系统环 ...

  2. java高并发之线程池

    Java高并发之线程池详解   线程池优势 在业务场景中, 如果一个对象创建销毁开销比较大, 那么此时建议池化对象进行管理. 例如线程, jdbc连接等等, 在高并发场景中, 如果可以复用之前销毁的对 ...

  3. Unable to preventDefault inside passive event listener due to target being treated as passive. See https://www.chromestatus.com/features/5093566007214080

    解决办法: 两个方案:1.注册处理函数时,用如下方式,明确声明为不是被动的window.addEventListener('touchmove', func, { passive: false }) ...

  4. 【Linux_Shell 脚本编程学习笔记五、Oracle JDK1.8 安装shell 脚本】

    脚本使用说明: 首先在脚本的同级目录下有个 jdk的安装包 脚本和安装包必须在同级目录下才能够安装(脚本没有优化,还可以使用  wget  从网上下载指定版本的  jdk 安装包) #!/bin/sh ...

  5. Qt QImag图像保存、格式转换

    图像保存bool QImage::save(const QString &fileName, const char *format = Q_NULLPTR, int quality = -1) ...

  6. mudbox安装未完成,某些产品无法安装的解决方法

    mudbox提示安装未完成,某些产品无法安装该怎样解决呢?,一些朋友在win7或者win10系统下安装mudbox失败提示mudbox安装未完成,某些产品无法安装,也有时候想重新安装mudbox的时候 ...

  7. gin源码剖析

    介绍 Gin 是一个 Golang 写的 web 框架,具有高性能的优点,基于 httprouter,它提供了类似martini但更好性能(路由性能约快40倍)的API服务.官方地址:https:// ...

  8. fiddler问题汇总

    fiddler教程:https://kb.cnblogs.com/page/130367/ fiddler下载安装:https://www.cnblogs.com/mini-monkey/p/1128 ...

  9. Oauth2.0 协议简介及 php实例代码

    转自:http://www.dahouduan.com/2017/11/21/oauth2-php/ https://blog.csdn.net/halsonhe/article/details/81 ...

  10. MyBatis学习总结之一对多映射

    1.首先创建2张表:students 和grades create table grades( gid ) primary key, gname varchar() ); create table s ...