属性为类、结构体、枚举或它们的实例提供了功能。属性可以存储值、计算值,也可以观察和响应变化。在本章中,我们将详细介绍Swift中的各种属性类型及其使用方法。
存储属性
存储属性是存储在实例中的常量或变量。它们可以在定义时初始化,也可以在实例初始化过程中进行设置。
定义存储属性
struct Point { var x = 0.0 var y = 0.0 }
在这个例子中,Point
结构体有两个存储属性 x
和 y
,它们都是 Double
类型,并且默认值为 0.0
。
修改存储属性
你可以通过实例来修改存储属性的值。
var point = Point() point.x = 1.0 point.y = 2.0
只读存储属性
只读存储属性只能在初始化过程中设置,并且之后不能更改。
struct ImmutablePoint { let x: Double let y: Double } let immutablePoint = ImmutablePoint(x: 3.0, y: 4.0) // immutablePoint.x = 5.0 // 错误:无法修改只读属性
计算属性
计算属性不直接存储值,而是提供一个getter和setter来间接获取和设置其他属性或变量的值。
定义计算属性
-- -------------------- ---- ------- ------ --------- - --- ----- - --- --- ------ - --- --- ----- ------ - ------ ----- - ------ - - --- --------- - ---------------- ---- ------- ---- --------------------- -- -------
在这个例子中,Rectangle
结构体有一个计算属性 area
,它返回 width
和 height
的乘积。
带有 setter 的计算属性
计算属性可以包含一个可选的 setter,用于设置计算属性的新值。
-- -------------------- ---- ------- ------ ------ - ------------ --- ---------- - --- --- ---------- ------ - --- - ------ ---------- - - - ----------------- - ---------- - ------------ - - - - - --- ------ - ------------------ ----- ----------------------- -- ------- ---------------- - ---- ------------------------ -- -------
在这个例子中,Square
结构体有一个计算属性 perimeter
,它可以根据 sideLength
计算出来,同时也可以通过 perimeter
设置新的 sideLength
。
属性观察器
属性观察器允许你在属性值改变时执行代码。Swift 提供了 willSet
和 didSet
来实现这一功能。
定义属性观察器
-- -------------------- ---- ------- ----- ----------- - --- -------- ------ - --- - ------------------- - --------------- --------------- - ------ - -- ------- - ------- - ------- - -------- --------------------- ------------- - - - - --- ----------- - ------------- ------------------- - ---- -- ----------- ---- ------------------- - ------ -- ----------- ------ -- -------------- ----
在这个例子中,Temperature
类有一个存储属性 celsius
,它使用 willSet
和 didSet
观察器来监控其值的变化。
属性方法
属性方法是定义在类型上的函数,用于访问或修改该类型的属性。
定义属性方法
-- -------------------- ---- ------- ------ ------ - --- ------- ------ ---- --------------- -- ------ - ------ - - --------- - ------ - - --- ------ - -------------- ---- ----------------------------- -- --------------------
在这个例子中,Circle
结构体有一个存储属性 radius
和一个计算圆周长的方法 circumference
。
属性包装
属性包装是一种机制,允许你在属性的 getter 和 setter 中插入自定义行为。
使用属性包装
-- -------------------- ---- ------- ---------------- ------ -------------- - ------- --- ------- --- - - --- ------------- --- - --- - ------ ------ - --- - -- -------- -- - - ------ - -------- - ---- - ------ - - - - - - ------ ------ - --------------- --- ---- --- - --- ------ - -------- ---------- - -- ----------------- -- ----- ---------- - -- ----------------- -- ----
在这个例子中,PositiveNumber
是一个属性包装器,它确保被包装的值始终是非负的。Person
结构体使用这个属性包装器来定义 age
属性。
以上就是关于 Swift 属性的详细介绍。通过这些知识,你可以更灵活地管理和操作你的数据。