推荐答案
在 Swift 中,属性(Property)是与类、结构体或枚举相关联的值。属性可以是存储属性(Stored Property),也可以是计算属性(Computed Property)。存储属性用于存储常量或变量的值,而计算属性则通过计算来获取值。
本题详细解读
存储属性(Stored Property)
存储属性是最简单的属性类型,它们用于存储类或结构体实例中的常量或变量。存储属性可以是常量(使用 let 声明)或变量(使用 var 声明)。
struct Person {
var name: String // 存储属性
let age: Int // 存储属性
}在上面的例子中,name 和 age 都是存储属性。name 是一个变量,可以在实例创建后修改,而 age 是一个常量,一旦实例创建后就不能再修改。
计算属性(Computed Property)
计算属性不直接存储值,而是提供一个 getter 和一个可选的 setter 来间接获取和设置其他属性或值。
// www.javascriptcn.com code example
struct Rectangle {
var width: Double
var height: Double
var area: Double { // 计算属性
get {
return width * height
}
set {
width = sqrt(newValue)
height = sqrt(newValue)
}
}
}在上面的例子中,area 是一个计算属性。它通过 width 和 height 来计算矩形的面积。area 的 setter 允许我们通过设置面积来调整 width 和 height。
属性观察器(Property Observers)
属性观察器用于监控存储属性的值变化,即使新值与当前值相同,也会触发观察器。属性观察器有 willSet 和 didSet 两种。
// www.javascriptcn.com code example
class StepCounter {
var totalSteps: Int = 0 {
willSet(newTotalSteps) {
print("About to set totalSteps to \(newTotalSteps)")
}
didSet {
if totalSteps > oldValue {
print("Added \(totalSteps - oldValue) steps")
}
}
}
}在上面的例子中,totalSteps 属性有一个 willSet 观察器和一个 didSet 观察器。每当 totalSteps 的值发生变化时,这两个观察器都会被调用。
类型属性(Type Property)
类型属性是属于类型本身的属性,而不是类型的实例。类型属性可以是存储属性或计算属性,并且它们使用 static 关键字来定义。
struct SomeStructure {
static var storedTypeProperty = "Some value."
static var computedTypeProperty: Int {
return 1
}
}在上面的例子中,storedTypeProperty 和 computedTypeProperty 都是类型属性。它们属于 SomeStructure 类型本身,而不是它的实例。
延迟存储属性(Lazy Stored Property)
延迟存储属性是指其初始值在第一次使用时才计算的属性。延迟存储属性使用 lazy 关键字来定义。
class DataImporter {
var filename = "data.txt"
}
class DataManager {
lazy var importer = DataImporter()
var data = [String]()
}在上面的例子中,importer 是一个延迟存储属性。它的初始值在第一次访问时才会被创建。