你可以创建自己的结构体类型,它们有自己的属性和方法。
你学习了存储属性,以及每一次通过临时计算得到值的计算属性。
当你希望在方法中修改属性时,需要把方法标记成mutating。
构造器是创建结构体时的特殊方法。默认情况下,你会得到一个逐一成员构造器。不过,如果你想要自行实现构造器的话,需要确保所有的属性都被赋值。
你可以在方法中用 self 常量来引用当前正在使用的结构体实例。
lazy 关键字告诉Swift你希望属性在第一次访问时才被创建。
可以利用static关键字在结构体的所有实例间共享属性和方法。
访问控制使得我们可以限制哪些代码能够访问属性和方法。
//构造器,必须确保构造器结束前所有的属性都被赋值
struct User {
var username: String
init(){
username = "Anonymous"
print("创建新用户!")
}
}
//var user = User(username: "Ben")
var user = User()
user.username = "lang"
//self 引用当前实例,区分属性和参数
struct Person {
var name: String
init(name: String) {
print("\(name)已经被占用了!")
self.name = name
}
}
//懒加载属性
struct FamliyTree {
init() {
print("创建族谱!")
}
}
struct Person {
var name: String
lazy var familyTree = FamliyTree()
init(name: String) {
self.name = name
}
}
var ed = Person(name: "Ed")
//假如某些情况我们并不需要用到某个人的族谱信息呢?我们可以在 familyTree 属性前添加 lazy 关键字,Swift将会在 familyTree 属性第一次被访问的时候才执行创建代码
//如果你想要看到 “创建族谱!” 这条信息被打印,你至少需要访问 familyTree 属性一次:
ed.familyTree
//输出“创建族谱!“
//静态属性和方法,在不同的结构体实例之间共享属性和方法
struct Student {
//添加一个静态属性,用以存放班级学生的总数
static var classSize = 0
var name: String
init(name: String) {
self.name = name
//每当我们创建一个新的 student 实例时,我们将这个属性的数值加1
Student.classSize += 1
}
}
let ed = Student(name: "ED")
let ben = Student(name: "BEN")
print(Student.classSize)//输出2
//private访问控制,私有属性,只能在结构体内访问
//public,它使得所有的其他代码都能够访问到目标属性或者方法
struct Person {
private var id: String
init(id: String) {
self.id = id
}
func identify() -> String {
return "ed的社保ID是\(id)"
}
}
let ed = Person(id: "12345")
网友评论