Swift属性是用于将值与特定的类、结构或枚举关联的特征。文章将介绍Swift属性的基本概念和不同类型的属性,包括存储属性、计算属性和类属性。存储属性用于存储一个常量或变量作为实例的一部分,而计算属性通过计算得出结果而不是存储值。类属性是属于整个类而不是实例的属性。此外,还将介绍属性观察器和延迟存储属性的使用。最后,文章将使用一些示例来说明如何使用Swift属性来实现一些常见的功能。
Swift 属性
在Swift中,属性是类、结构体和枚举中的一种值,用于存储特定的数据或提供特定的功能。Swift中的属性可以分为存储属性和计算属性。存储属性用于存储特定的常量或变量,而计算属性则根据其他属性的值计算出一个结果。
存储属性
存储属性是将值存储在特定的实例中的属性。它们可以是变量(用`var`声明)或常量(用`let`声明)。在声明存储属性时,需要指定数据类型以及可选的初始值。
“`swift
struct Point {
var x: Int
var y: Int
}
var point = Point(x: 10, y: 20)
print(point.x) // 输出:10
point.x = 30
print(point.x) // 输出:30
“`
上述示例中,我们定义了一个结构体`Point`,其中包含了两个存储属性`x`和`y`。我们可以通过访问属性来获取或修改实例的属性值。
计算属性
计算属性是通过计算而得到的属性。它们并不存储实际的值,而是提供一个 getter 和一个可选的 setter 来计算其他属性的值。
“`swift
struct Circle {
var radius: Double
var area: Double {
return 3.14 * radius * radius
}
}
var circle = Circle(radius: 5)
print(circle.area) // 输出:78.5
circle.radius = 10
print(circle.area) // 输出:314.0
“`
上述示例中,我们定义了一个结构体`Circle`,其中包含了一个存储属性`radius`和一个计算属性`area`。计算属性`area`的值是根据存储属性`radius`计算得出的。
属性观察器
属性观察器允许我们在属性值将要被设置或已经被设置后执行代码。Swift中的属性观察器有两种:`willSet`和`didSet`。
“`swift
class Temperature {
var celsius: Double = 0 {
willSet {
print(“将温度从\(celsius)摄氏度改为\(newValue)摄氏度”)
}
didSet {
print(“温度已经从\(oldValue)摄氏度改为\(celsius)摄氏度”)
}
}
}
var temperature = Temperature()
temperature.celsius = 25
// 输出:
// 将温度从0摄氏度改为25摄氏度
// 温度已经从0摄氏度改为25摄氏度
“`
在上述示例中,我们定义了一个类`Temperature`,其中包含了一个存储属性`celsius`和两个属性观察器`willSet`和`didSet`。属性观察器会在属性值将要被设置和已经被设置后分别执行相应的代码。
全局变量和局部变量
除了在类、结构体和枚举中定义属性,我们还可以在全局范围内定义全局变量和在函数、方法等局部范围内定义局部变量。
“`swift
var globalVariable = 10
func someFunction() {
var localVariable = 20
globalVariable += localVariable
}
someFunction()
print(globalVariable) // 输出:30
“`
上述示例中,我们定义了一个全局变量`globalVariable`和一个函数`someFunction`,其中包含了一个局部变量`localVariable`。在函数中,我们将局部变量的值添加到全局变量上,并打印全局变量的值。
延迟存储属性
延迟存储属性是指在第一次被调用时才会计算初始值的属性。通过使用`lazy`关键字,我们可以将属性定义为延迟存储属性。
“`swift
class DataImporter {
var filename = “data.txt”
}
class DataManager {
lazy var importer = DataImporter()
var data = [String]()
}
let manager = DataManager()
manager.data.append(“Some data”)
print(manager.importer.filename) // 输出:data.txt
“`
在上述示例中,我们定义了两个类`DataImporter`和`DataManager`。`DataImporter`类包含一个属性`filename`,而`DataManager`类包含一个延迟存储属性`importer`和一个普通属性`data`。在创建`DataManager`实例时,`importer`属性并不会被立即创建,直到第一次使用时才会计算初始值。
类型属性
类型属性是被类型本身所持有的属性,而不是被类型的实例所持有的属性。可以通过在属性前面添加`static`关键字或`class`关键字来声明类型属性,在类中使用`class`关键字声明的类型属性可以被子类重写。
“`swift
struct Size {
static var width = 0
static var height = 0
}
print(Size.width) // 输出:0
Size.width = 10
print(Size.width) // 输出:10
“`
在上述示例中,我们定义了一个结构体`Size`,其中包含了两个类型属性`width`和`height`。可以直接通过类型来访问类型属性的值。
总结
Swift中的属性分为存储属性和计算属性,存储属性用于存储特定的值,计算属性用于根据其他属性的值计算出结果。属性观察器允许我们在属性值将要被设置或已经被设置后执行代码。全局变量和局部变量是在全局范围和局部范围内定义的变量。延迟存储属性是在第一次使用时才会计算初始值的属性。类型属性是被类型本身持有的属性,可以通过类型来访问。