属性分类
在Swift中, 严格意义上来讲属性可以分为两大类: 实例属性和类型属性
- 实例属性(
Instance Property
): 只能通过实例去访问的属性- 存储实例属性(
Stored Instance Property
): 存储在市里的内存中, 每个实例都只有一份
- 存储实例属性(
- 计算实例属性(
Computed Instance Property
) - 类型属性(
Type Property
): 只能通过类型去访问的属性 - 存储类型属性(
Stored Type Property
): 整个程序运行过程中就只有一份内存(类似全局变量) - 计算类型属性(
Computed Type Property
) - 类型属性可以通过
static
关键字定义; 如果是类也可以通过class
关键字定义 - 实例属性属于一个特定类型的实例,每创建一个实例,实例都拥有属于自己的一套属性值,实例之间的属性相互独立
- 为类型本身定义属性,无论创建了多少个该类型的实例,这些属性全局都只有唯一一份,这种属性就是类型属性
实例属性
上面提到Swift
中相关的属性可以分为两大类:存储属性和计算属性
-
存储属性(
Stored Property
)- 类似于成员变量,系统会为其分配内存空间,存储属性存储在实例的内存中
存储属性可以是变量存储属性(用关键字var
定义),也可以是常量存储属性(用关键字let
定义) - 结构体和类可以定义存储属性, 枚举不可以定义存储属性
- 类似于成员变量,系统会为其分配内存空间,存储属性存储在实例的内存中
-
计算属性(Computed Property)
- 计算属性其本质就是方法(函数), 系统不会为其分配内存空间, 所以计算属性不会占用- 实例对象的内存
- 计算属性不直接存储值,而是提供一个
getter
和一个可选的setter
,来间接获取和设置其他属性或变量的值
存储属性
- 在
Swift
中存储属性可以是var
修饰的变量, 也可以是let
修饰的常量 - 但是在创建类或结构体的实例时, 必须为所有的存储属性设置一个合适的初始值, 否则会报错的
- 可以在定义属性的时候, 为其设置一个初始值
- 可以在
init
初始化器里为存储实行设置一个初始值
struct Person {
// 定义的时候设置初始值
var age: Int = 24
var weight: Int
}
// 使用init初始化器设置初始值
var person1 = Person(weight: 75)
var person2 = Person(age: 25, weight: 80)
- 上面两个属性是会占用实例的内存空间的
- 可以使用
MemoryLayout
获取数据类型占用的内存大小
// Person结构体实际占用的内存大小
MemoryLayout<Person>.size // 16
// 系统为Person分配的内存大小
MemoryLayout<Person>.stride // 16
// 内存对其参数
MemoryLayout<Person>.alignment // 8
有一种使用方式, 输出结果一致
var person = Person(weight: 75
MemoryLayout.size(ofValue