📅  最后修改于: 2023-12-03 14:47:48.236000             🧑  作者: Mango
在 Swift 语言中,属性是一种常见的声明机制,用于为类、结构体和枚举添加特定的值。这些值可以被其他对象读取和修改。属性既可以是实例属性(Instance Property),也可以是类型属性(Type Property),还可以是存储属性(Stored Property)或计算属性(Computed Property)。
存储属性是指保存在特定类或结构体的实例中的常量或变量。存储属性可以是变量(var)或常量(let)。它们必须在声明时被初始化,或者在构造器中初始化。下面是一个示例:
struct Rectangle {
var width: Int
var height: Int
}
var rectangle = Rectangle(width: 10, height: 20)
print(rectangle.width) // 输出 10
上面的代码中,我们定义了一个 Rectangle
结构体,它有两个存储属性 width
和 height
。我们创建一个 Rectangle
实例并给它赋初值,然后访问它的 width
属性,输出 10。
计算属性是指通过某种计算方法得到的值。它们不存储实际的值,而是提供 getter 和 setter 方法来获取和设置值。计算属性必须用 var
关键字声明,因为它们的值可以在获取时改变。下面是一个示例:
struct Circle {
var radius: Double
var diameter: Double {
get {
return radius * 2
}
set {
radius = newValue / 2
}
}
}
var circle = Circle(radius: 10)
print(circle.diameter) // 输出 20
circle.diameter = 40
print(circle.radius) // 输出 20
上面的代码中,我们定义了一个 Circle
结构体,它有一个存储属性 radius
和一个计算属性 diameter
。计算属性的 get
方法返回 radius
的两倍,set
方法将传入的值除以二并赋给 radius
。我们创建一个 Circle
实例并访问它的 diameter
属性,输出 20。然后我们给它的 diameter
属性赋值为 40,由于 diameter
是计算属性,它的 set
方法会被调用,并设置了 radius
的新值为 20。我们再次访问 radius
属性,输出 20。
类型属性是指为类型本身定义的属性,而不是类型的实例属性。它可以用于存储类型的常量或变量,也可以用于定义类型的计算属性。类型属性必须用 static
关键字声明,或者用 class
关键字声明如果它是一个类的计算属性,并需要子类可以重写它的 getter 和 setter 方法。下面是一个示例:
struct Car {
static let maxSpeed = 200
static var count = 0
var speed: Int
static var avgSpeed: Double {
return Double(count) / Double(maxSpeed)
}
init(speed: Int) {
self.speed = speed
Car.count += 1
}
}
var car1 = Car(speed: 100)
var car2 = Car(speed: 150)
print(Car.maxSpeed) // 输出 200
print(Car.count) // 输出 2
print(Car.avgSpeed) // 输出 0.01
上面的代码中,我们定义了一个 Car
结构体,它有一个存储属性 maxSpeed
和一个类型属性 count
,还有一个计算属性 avgSpeed
。我们创建两个 Car
实例并访问它们的属性,再访问 Car
类型的属性和计算属性,输出相应的结果。示例代码返回 200,2 和 0.01。
属性观察器是指在属性值发生变化前和变化后执行的代码块。属性观察器可以在存储属性和子类重写的计算属性中使用。它们使用 willSet
和 didSet
两个方法来观察属性值的变化。下面是一个示例:
struct Temperature {
var celsius: Double {
didSet {
if celsius > 100 {
print("Warning: Boiling")
} else if celsius < 0 {
print("Warning: Freezing")
}
}
}
}
var temperature = Temperature(celsius: 37)
temperature.celsius = 50 // 不输出任何内容
temperature.celsius = 101 // 输出 "Warning: Boiling"
上面的代码中,我们定义了一个 Temperature
结构体,它有一个计算属性 celsius
。在属性的 didSet
方法中,我们检查温度是否过高或过低,并发送相应的警告。我们创建一个 Temperature
实例并将其赋值为 37,然后分别将它的 celsius
属性设置为 50 和 101。第一个赋值不输出任何内容,第二个赋值输出 "Warning: Boiling"。
Swift 的属性机制为程序员提供了丰富的功能来存储和操作数据。存储属性、计算属性、类型属性和属性观察器的不同类型使得属性在多种情况下都可以使用。这些属性可以让我们更轻松地定义和修改数据,使我们的代码更加具有可读性和重用性。