Swift8——属性

定义

Swift中跟实例相关的属性可以 分为2大类,存储属性和计算属性

demo

存储属性

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

存储属性初始值

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

计算属性

  • 本质就是方法(函数)
  • 不占用实例的内存
  • 枚举、结构体、类都可以定义计算属性(因为他们都能定义方法)

计算属性初始值

  • set传入的新值默认叫做newValue,也可以自定义
  • 只读计算属性:只有get没有set (不能只有set,编译器会报错)
  • 定义计算属性只能用var不能使用let
  • 计算属性的值是可能发生变化的(即使是只读计算属性)
自定义默认
只有get

枚举值rawValue原理

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

延迟存储属性

  • 使用lazy可以定义一个延迟存储属性,在第一次用到属性的时候才会进行初始化
  • lazy属性必须是var 不能是let(因为let要求初始化必须有值,所以不能与lazy一起使用)
延迟

延迟存储属性的注意点

  • 如果多线程同时第一访问lazy属性
  • 无法保证属性只能被初始化一次
  • 能够使一些不需要第一时间加载的,在需要的时间再去调用
  • 当结构体包含一个延迟存储属性时,只要var才能访问延迟属性
  • 因为延迟属性初始化时需要改变结构体的内存,

// p.z调用的时候,去初始化z,去改变结构体的内存,但是p是let,是不允许的,若是为var ,则是可以修改。

注意点

属性观察器

  • 可以为非lazyvar``存储属性设置属性观察器
  • willSet会传递新值,默认叫newValue
  • didSet会传递旧值,默认叫oldValue
  • 在初始化器中设置属性值不会触发willSetdidSet
  • 在属性定义时设置属性值不会触发willSetdidSet
image.png
  • 属性观察器、计算属性的功能,同样可以应用在全局变量、局部变量
Demo
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Swift语法基础(五)-- (类和结构体、属性、方法) 本章将会介绍 类和结构体对比结构体和枚举是值类型类是引用...
    寒桥阅读 1,103评论 0 1
  • 中文文档 一、存储属性 一个存储属性就是存储在特定类或结构体实例里的一个常量或变量。 存储属性可以是变量存储属性(...
    伯wen阅读 210评论 0 0
  • 属性用例: 存储属性 计算属性可用于类、结构体、枚举。存储属性只能用于类和结构体。 结构体实例如果被赋值给一个常量...
    xmb阅读 199评论 0 0
  • 属性 Swift中跟实例相关的属性可以分为2大类 存储属性(Stored Property) 类似于成员变量这个概...
    codeTao阅读 166评论 0 1
  • 1、存储属性(var和let) 存储属性是一个作为特定类和结构体实例一部分的常量或变量。存储属性要么是变量存储属性...
    余晖依旧耀眼阅读 366评论 0 0