百日学 Swift(Day 9) – access control, static properties, and laziness(结构体 第 2 部分:访问控制、静态属性和懒加载)
1. Initializers(初始化器) – test
初始化程序是特殊的方法,提供了创建结构的不同方法。默认情况下,所有结构都带有一个结构,称为成员初始化程序 ——这要求您在创建结构时为每个属性提供一个值。
可以提供自己的初始化程序来替换默认的初始化程序。不必在初始化器前写 func
,但需要确保初始化结束时所有的属性都有值。
2. Referring to the current instance(引用当前实例) – test
struct Person {
var name: String
init(name: String) {
print("\(name) 被创建!")
self.name = name // self.name引用属性,而name引用参数。
}
}
3. Lazy properties(懒惰属性) – test
struct FamilyTree {
init() {
print("创建家谱")
}
}
我们可以将该FamilyTree
结构用作Person
结构内部的属性,如下所示:
struct Person {
var name: String
var familyTree = FamilyTree()
init(name: String) { // 初始化并未给family值(调用FamilyTree)
self.name = name
}
}
var confucius = Person(name: "孔子") // 但是仍会调用,因为要确保每个属性都有值,所以打印了。
但是,如果我们不总是需要某个人的家谱怎么办?如果我们将lazy
关键字添加到familyTree
属性,则Swift仅在FamilyTree
首次访问该结构时才会创建该结构:
lazy var familyTree = FamilyTree()
这样初始化后,familyTree 为 nil,就不会打印了。
因此,如果您想看到消息“创建家谱” ,您需要至少访问一次该属性:
confucius.familyTree
4. Static properties and methods(静态属性和方法) – test
struct Student {
static var classSize = 0 // 静态变量
var name: String
init(name: String) {
self.name = name
Student.classSize += 1 // classSize属性属于结构本身而不是结构实例
}
}
let lilei = Student(name: "李雷")
let hanmeimei = Student(name: "韩梅梅")
print(Student.classSize) // 结果是 2
5. Access control(访问控制) – test
struct Person {
private var id: String // 将 id 属性设为私有,只有结构体内部可以访问,结构体外部不可访问
init(id: String) {
self.id = id
}
func identify() -> String {
return "我的身份证号码是 \(id)"
}
}
- 如果使用
public
关键字,则会允许所有其他代码访问。
6. Structs summary(结构体小结) – test
- 可以使用结构创建自己的类型,这些结构可以具有自己的属性和方法。关键字
struct
- 可以使用存储属性,或使用计算属性即时计算值。
- 如果要在方法内更改结构体的属性,则必须将方法标记为
mutating
。- 初始化程序
init()
是创建结构的特殊方法。默认情况下,将获得一个成员初始化器,但是如果创建自己的初始化器,则必须为所有属性赋予一个值(虽然可能不必要传递所有的参数给初始化器)。- 使用
self
常量来引用方法内部结构的当前实例。lazy
关键字告诉 Swift 只能创建属性,当第一次使用时再调用或赋值。- 可以使用
static
关键字在结构的所有实例之间共享属性和方法。- 访问控制可以限制其它代码使用属性和方法。