属性与方法
在 Swift 中,属性和方法是类(Class)和结构体(Struct)的核心组成部分。属性用于存储数据,而方法则用于定义与这些数据相关的行为。通过合理地使用属性和方法,您可以将数据和行为封装到类型中,从而提高代码的可读性、可维护性和重用性。
1. 属性
属性是类、结构体或枚举中的常量或变量,用于存储值。属性可以分为两种类型:存储属性和计算属性。
存储属性
存储属性用于存储常量或变量值,通常用于类和结构体中。存储属性可以是常量(let)或变量(var)。存储属性在实例化对象时分配内存。
class Car {
var brand: String
var year: Int
init(brand: String, year: Int) {
self.brand = brand
self.year = year
}
}
let myCar = Car(brand: "Toyota", year: 2020)
print(myCar.brand) // 输出 "Toyota"
在上面的代码中,brand 和 year 是 Car 类的存储属性,它们存储关于 Car 实例的信息。
计算属性
计算属性不直接存储值,而是通过提供一个 getter 和 setter 来计算和返回值。计算属性通常用于当属性的值可以通过其他属性计算得出时。
struct Rectangle {
var width: Double
var height: Double
// 计算属性
var area: Double {
return width * height
}
}
let rectangle = Rectangle(width: 5.0, height: 3.0)
print(rectangle.area) // 输出 15.0
在这个例子中,area 是 Rectangle 结构体的计算属性。它没有存储值,而是根据 width 和 height 的值动态计算结果。
只读计算属性
如果计算属性只提供 getter,而没有 setter,它就是只读计算属性。只读计算属性可以省略 get 关键字。
struct Circle {
var radius: Double
// 只读计算属性
var area: Double {
return .pi * radius * radius
}
}
let circle = Circle(radius: 4.0)
print(circle.area) // 输出 50.26548245743669
在上面的例子中,area 是一个只读的计算属性,它根据 radius 计算圆的面积。
2. 方法
方法是定义在类、结构体或枚举中的函数,用于操作数据或执行特定任务。方法可以访问和修改实例的属性。
实例方法
实例方法是与特定实例关联的方法,可以访问和修改实例的属性。
class Car {
var brand: String
var year: Int
init(brand: String, year: Int) {
self.brand = brand
self.year = year
}
// 实例方法
func displayDetails() {
print("Brand: \(brand), Year: \(year)")
}
}
let myCar = Car(brand: "Toyota", year: 2020)
myCar.displayDetails() // 输出 "Brand: Toyota, Year: 2020"
在这个例子中,displayDetails 是 Car 类的实例方法,用于显示汽车的详细信息。
修改实例方法中的属性
实例方法可以修改实例的属性,前提是这些属性是变量(var)而不是常量(let)。
class Car {
var brand: String
var year: Int
init(brand: String, year: Int) {
self.brand = brand
self.year = year
}
// 修改实例属性
func updateYear(to newYear: Int) {
year = newYear
}
}
var myCar = Car(brand: "Toyota", year: 2020)
myCar.updateYear(to: 2023)
print(myCar.year) // 输出 2023
在这个例子中,updateYear 是一个实例方法,它修改了 Car 实例的 year 属性。
类型方法
类型方法是与类型本身(而非特定实例)相关联的方法。类型方法通过 class(类)、static(结构体和枚举)关键字定义,并通过类型本身调用,而不是通过实例。
class Car {
static var totalCars = 0
init() {
Car.totalCars += 1
}
// 类型方法
static func displayTotalCars() {
print("Total cars: \(totalCars)")
}
}
let car1 = Car()
let car2 = Car()
Car.displayTotalCars() // 输出 "Total cars: 2"
在这个例子中,displayTotalCars 是一个类型方法,它通过 Car 类调用,而不是通过 Car 类的实例调用。
3. 属性观察器
属性观察器用于监听属性值的变化。它可以在属性被设置新值时触发。Swift 提供了 willSet 和 didSet 两个属性观察器。
- willSet:在属性的值被改变之前调用。
- didSet:在属性的值被改变之后调用。
class Car {
var brand: String {
willSet {
print("The brand is about to change to \(newValue).")
}
didSet {
print("The brand was changed from \(oldValue) to \(brand).")
}
}
init(brand: String) {
self.brand = brand
}
}
var myCar = Car(brand: "Toyota")
myCar.brand = "Honda"
// 输出:
// The brand is about to change to Honda.
// The brand was changed from Toyota to Honda.
在这个例子中,当 brand 属性的值发生变化时,willSet 和 didSet 被触发,分别打印出即将变化的值和变化后的值。
4. 总结
- 存储属性 存储数据,直接关联到类、结构体或枚举的实例。
- 计算属性 动态计算值,而不是存储值,通常用于基于其他属性计算得出的数据。
- 实例方法 定义在类、结构体或枚举中,可以访问和修改实例的属性。
- 类型方法 与类型本身相关联,不需要实例化类型即可调用。
- 属性观察器 提供了对属性值变化的监控,可以通过 willSet 和 didSet 实现对属性值变化的响应。
通过理解和掌握属性与方法,您可以有效地组织数据和行为,构建更为健壮和灵活的代码。
