属性为类、结构体、枚举或它们的实例提供了功能。属性可以存储值、计算值,也可以观察和响应变化。在本章中,我们将详细介绍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来间接获取和设置其他属性或变量的值。
定义计算属性
// www.javascriptcn.com code example
struct Rectangle {
var width = 0.0
var height = 0.0
var area: Double {
return width * height
}
}
let rectangle = Rectangle(width: 5.0, height: 4.0)
print(rectangle.area) // 输出:20.0在这个例子中,Rectangle 结构体有一个计算属性 area,它返回 width 和 height 的乘积。
带有 setter 的计算属性
计算属性可以包含一个可选的 setter,用于设置计算属性的新值。
// www.javascriptcn.com code example
struct Square {
private(set) var sideLength = 0.0
var perimeter: Double {
get {
return sideLength * 4
}
set(newPerimeter) {
sideLength = newPerimeter / 4
}
}
}
var square = Square(sideLength: 10.0)
print(square.perimeter) // 输出:40.0
square.perimeter = 60.0
print(square.sideLength) // 输出:15.0在这个例子中,Square 结构体有一个计算属性 perimeter,它可以根据 sideLength 计算出来,同时也可以通过 perimeter 设置新的 sideLength。
属性观察器
属性观察器允许你在属性值改变时执行代码。Swift 提供了 willSet 和 didSet 来实现这一功能。
定义属性观察器
// www.javascriptcn.com code example
class Temperature {
var celsius: Double = 0.0 {
willSet(newCelsius) {
print("即将设置摄氏度为 \(newCelsius)")
}
didSet {
if celsius < -273.15 {
celsius = oldValue
print("温度低于绝对零度,恢复为旧值 \(oldValue)")
}
}
}
}
var temperature = Temperature()
temperature.celsius = 30.0 // 输出:即将设置摄氏度为 30.0
temperature.celsius = -300.0 // 输出:即将设置摄氏度为 -300.0
// 温度低于绝对零度,恢复为旧值 30.0在这个例子中,Temperature 类有一个存储属性 celsius,它使用 willSet 和 didSet 观察器来监控其值的变化。
属性方法
属性方法是定义在类型上的函数,用于访问或修改该类型的属性。
定义属性方法
// www.javascriptcn.com code example
struct Circle {
var radius: Double
func circumference() -> Double {
return 2 * Double.pi * radius
}
}
let circle = Circle(radius: 5.0)
print(circle.circumference()) // 输出:31.41592653589793在这个例子中,Circle 结构体有一个存储属性 radius 和一个计算圆周长的方法 circumference。
属性包装
属性包装是一种机制,允许你在属性的 getter 和 setter 中插入自定义行为。
使用属性包装
// www.javascriptcn.com code example
@propertyWrapper
struct PositiveNumber {
private var number: Int = 0
var wrappedValue: Int {
get { return number }
set {
if newValue >= 0 {
number = newValue
} else {
number = 0
}
}
}
}
struct Person {
@PositiveNumber var age: Int
}
var person = Person()
person.age = 25
print(person.age) // 输出:25
person.age = -5
print(person.age) // 输出:0在这个例子中,PositiveNumber 是一个属性包装器,它确保被包装的值始终是非负的。Person 结构体使用这个属性包装器来定义 age 属性。
以上就是关于 Swift 属性的详细介绍。通过这些知识,你可以更灵活地管理和操作你的数据。