跳到主要内容

Swift 属性

在Swift中,属性是与类、结构体或枚举相关联的值。属性可以是存储值,也可以是计算值。它们还可以通过属性观察器来监听值的变化。理解属性是掌握Swift面向对象编程的关键。

存储属性

存储属性是最简单的属性类型,它们用于存储常量或变量的值。存储属性可以是常量(用 let 声明)或变量(用 var 声明)。

swift
struct Person {
var name: String
let age: Int
}

var person = Person(name: "Alice", age: 25)
person.name = "Bob" // 可以修改
// person.age = 30 // 错误:age 是常量,不能修改

在上面的例子中,name 是一个变量存储属性,而 age 是一个常量存储属性。

计算属性

计算属性不直接存储值,而是提供一个 getter 和可选的 setter 来间接获取和设置其他属性或值。

swift
struct Rectangle {
var width: Double
var height: Double

var area: Double {
get {
return width * height
}
set(newArea) {
width = sqrt(newArea)
height = sqrt(newArea)
}
}
}

var rect = Rectangle(width: 10, height: 20)
print(rect.area) // 输出: 200.0

rect.area = 100
print(rect.width) // 输出: 10.0
print(rect.height) // 输出: 10.0

在这个例子中,area 是一个计算属性,它根据 widthheight 的值来计算面积。

属性观察器

属性观察器用于监听属性值的变化。你可以为存储属性添加 willSetdidSet 观察器。

swift
class StepCounter {
var totalSteps: Int = 0 {
willSet(newTotalSteps) {
print("About to set totalSteps to \(newTotalSteps)")
}
didSet {
if totalSteps > oldValue {
print("Added \(totalSteps - oldValue) steps")
}
}
}
}

let stepCounter = StepCounter()
stepCounter.totalSteps = 200
// 输出:
// About to set totalSteps to 200
// Added 200 steps

stepCounter.totalSteps = 360
// 输出:
// About to set totalSteps to 360
// Added 160 steps

在这个例子中,totalSteps 属性被修改时,willSetdidSet 观察器会被触发。

类型属性

类型属性是属于类型本身的属性,而不是类型的实例。你可以使用 static 关键字来定义类型属性。

swift
struct SomeStructure {
static var storedTypeProperty = "Some value."
static var computedTypeProperty: Int {
return 1
}
}

print(SomeStructure.storedTypeProperty) // 输出: Some value.
print(SomeStructure.computedTypeProperty) // 输出: 1

在这个例子中,storedTypePropertycomputedTypeProperty 都是类型属性。

实际应用场景

假设你正在开发一个购物车应用,你可以使用属性来管理商品的数量和总价。

swift
class ShoppingCart {
var items: [String: Double] = [:]

var totalPrice: Double {
return items.values.reduce(0, +)
}

func addItem(name: String, price: Double) {
items[name] = price
}
}

let cart = ShoppingCart()
cart.addItem(name: "Apple", price: 1.99)
cart.addItem(name: "Banana", price: 0.99)
print(cart.totalPrice) // 输出: 2.98

在这个例子中,totalPrice 是一个计算属性,它根据购物车中的商品价格来计算总价。

总结

Swift中的属性是类、结构体和枚举的重要组成部分。存储属性用于存储值,计算属性用于计算值,属性观察器用于监听值的变化,而类型属性则是属于类型本身的属性。理解这些概念将帮助你更好地设计和实现Swift程序。

附加资源

  • Swift官方文档 - 属性
  • 练习:尝试创建一个包含存储属性、计算属性和属性观察器的类,并测试其行为。