type
status
date
slug
summary
tags
category
icon
password
example-row
example-row
属性将值与特定的类、结构体或枚举关联。
- 存储属性会将常量和变量存储为实例的一部分,与特定类型的实例关联,只能用于类和结构体。
- 计算属性会直接计算值,与特定类型的实例关联,用于类、结构体和枚举。
- 类型属性直接与类型本身关联。
存储属性
常量结构体实例的存储属性
如果创建了一个结构体实例并将其赋值给一个常量,则无法修改该实例的任何属性。
延时加载存储属性
- 在属性声明前使用
lazy
来标示一个延时加载存储属性,延迟加载的存储属性只有在第一次被访问的时候才被创建。
- 必须将延时加载属性声明成变量,常量属性在构造过程完成之前必须要有初始值,因此无法声明成延时加载。
- 如果一个被标记为
lazy
的属性在没有初始化时就同时被多个线程访问,则无法保证该属性只会被初始化一次。
- 全局的常量或变量都是延迟计算的,不需要标记
lazy
修饰符。
计算属性
- 计算属性不直接存储值,而是提供一个
getter
和一个可选的setter
,来间接获取和设置其他属性或变量的值。
- 必须使用
var
关键字定义计算属性。
- 如果计算属性的
setter
没有定义表示新值的参数名,则可以使用默认名称newValue
。
- 如果整个
getter
是单一表达式,getter
可以忽略return
,隐式地返回这个表达式结果。
属性观察器
属性观察器监控和响应属性值的变化,每次属性被设置值的时候都会调用属性观察器,即使新值和当前值相同的时候也不例外。可以给自定义的存储属性,继承的存储属性,继承的计算属性添加属性观察器。
- 在子类中通过重写属性的方式为集成的属性添加属性观察器。
- 计算属性应当使用setter监控和响应值的变化,而不是尝试创建观察器。
willSet
在新的值被设置之前调用。
didSet
在新的值被设置之后调用。
- 如果将带有观察器的属性通过输入输出参数(
in-out
)方式传入函数,willSet
和didSet
也会调用。因为 输入输出参数(in-out
)采用了拷入拷出内存模式:即在函数内部使用的是参数的 copy,函数结束后,又对参数重新赋值。
StepCounter
类定义了一个叫 totalSteps
的 Int
类型的属性。它是一个存储属性,包含 willSet
和 didSet
观察器。属性包装器
属性包装器在管理属性如何存储和定义属性的代码之间添加了一个分隔层。定义一个属性包装器,需要创建一个定义
wrappedValue
属性的结构体、枚举或者类。另外,可以在局部存储型变量上使用属性包装器,但不能在全局变量或者计算型变量上使用。设置被包装属性的初始值示例
获取呈现值
通过
projectedValue
定义一个呈现值,用于获取定义逻辑的其他功能。类型属性
- 类型属性即类型的属性,在 Objective-C 中,作为全局的静态常量或变量定义的。在 Swift 中,类型属性是作为类型定义的一部分写在类型最外层的花括号内,因此它的作用范围也就在类型支持的范围内。
- 使用关键字
static
来定义类型属性。
- 跟实例属性一样,类型属性也是通过点运算符来访问。但是,类型属性是通过类型本身来访问。
- 作者:黄x黄
- 链接:https://hxhowl.site/article/swift015
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
相关文章