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
是一个计算属性,它根据 width
和 height
的值来计算面积。
属性观察器
属性观察器用于监听属性值的变化。你可以为存储属性添加 willSet
和 didSet
观察器。
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
属性被修改时,willSet
和 didSet
观察器会被触发。
类型属性
类型属性是属于类型本身的属性,而不是类型的实例。你可以使用 static
关键字来定义类型属性。
swift
struct SomeStructure {
static var storedTypeProperty = "Some value."
static var computedTypeProperty: Int {
return 1
}
}
print(SomeStructure.storedTypeProperty) // 输出: Some value.
print(SomeStructure.computedTypeProperty) // 输出: 1
在这个例子中,storedTypeProperty
和 computedTypeProperty
都是类型属性。
实际应用场景
假设你正在开发一个购物车应用,你可以使用属性来管理商品的数量和总价。
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官方文档 - 属性
- 练习:尝试创建一个包含存储属性、计算属性和属性观察器的类,并测试其行为。