推荐答案
在 Swift 中,存储属性(Stored Property)是类、结构体或枚举中用于存储值的变量或常量。存储属性可以是常量(let)或变量(var),并且它们可以是简单的数据类型,也可以是复杂的自定义类型。
示例代码
struct Person {
var name: String
let age: Int
}
var person = Person(name: "John", age: 30)
person.name = "Jane" // 可以修改,因为 name 是变量
// person.age = 31 // 编译错误,因为 age 是常量关键点
- 存储属性可以是变量(
var)或常量(let)。 - 如果存储属性是常量(
let),则一旦实例化后就不能再修改。 - 存储属性可以具有默认值,也可以在初始化时赋值。
本题详细解读
存储属性的定义
存储属性是类、结构体或枚举中用于存储值的变量或常量。它们可以是简单的数据类型(如 Int、String),也可以是复杂的自定义类型(如另一个结构体或类)。
存储属性的类型
- 变量存储属性:使用
var关键字声明,可以在实例化后修改。 - 常量存储属性:使用
let关键字声明,一旦实例化后就不能再修改。
存储属性的初始化
存储属性可以在定义时赋予默认值,也可以在初始化时赋值。如果存储属性没有默认值,则必须在初始化时赋值。
示例分析
struct Person {
var name: String
let age: Int
}
var person = Person(name: "John", age: 30)
person.name = "Jane" // 可以修改,因为 name 是变量
// person.age = 31 // 编译错误,因为 age 是常量在这个例子中,Person 结构体有两个存储属性:name 和 age。name 是变量存储属性,可以在实例化后修改;age 是常量存储属性,一旦实例化后就不能再修改。
存储属性的默认值
存储属性可以在定义时赋予默认值,这样在实例化时就不需要显式赋值。
struct Person {
var name: String = "Unknown"
let age: Int = 0
}
let person = Person() // 使用默认值在这个例子中,name 和 age 都有默认值,因此在实例化时不需要显式赋值。
存储属性的延迟初始化
Swift 还支持延迟存储属性(Lazy Stored Property),使用 lazy 关键字声明。延迟存储属性只有在第一次访问时才会被初始化。
// www.javascriptcn.com code example
class DataImporter {
var filename = "data.txt"
}
class DataManager {
lazy var importer = DataImporter()
var data = [String]()
}
let manager = DataManager()
manager.data.append("Some data")
manager.data.append("Some more data")
// importer 还没有被初始化
print(manager.importer.filename) // 此时 importer 被初始化在这个例子中,importer 是一个延迟存储属性,只有在第一次访问时才会被初始化。