/**
(4)延迟存储属性
Swift语言中所有的存储属性必须有初始值,也就是当构造完一个类或者结构体的对象后;
对象中所有的存储属性必须有初始值(这是这个语言要求的),但是也有例外,
其中延迟存储属性可以将属性的初始化向后推迟到该属性第一次被调用的时候。
1.这个属性不适合一开始初始化,取决于外部的很多因素;
2.属性有可能我们从来不用,但是它的初始化又需要较长时间;
必须将延迟存储属性声明成变量(使用var关键字),因为属性的值在实例构造完成之前可能无法得到。而常量属性在构造过程完成之前必须要有初始值,因此无法声明成延迟属性。
*/
struct MyStudent {
var name: String
var chinese: Double
var math: Double
func showMySelf() -> Void {
print("姓名:\(name),语文成绩:\(chinese),数学成绩:\(math)")
}
}
class MyClass {
var members:[MyStudent] = []
// 班级里面所有学生的平均成绩
// 按照该语言的特性,这里必须要有一个初始值,但是我们一开始没办法知道平均成绩的值
// 给它一个初始值0,也没有意义,不是真实的成绩。那么这里我们把它设为延迟存储属性lazy。
lazy var score: Double = MyClass().getscore()
func getscore() -> Double {
print("test lazy property")
var t: Double = 0.0
for i in members {
t += i.chinese
t += i.math
}
if members.count > 0 {
return t / Double(members.count)
} else {
return 0
}
}
func show() -> Void {
for i in members {
i.showMySelf()
}
}
}
let s0 = MyStudent.init(name: "zhangsan",chinese: 100.0,math: 100.0)
let s1 = MyStudent.init(name: "lisi",chinese: 90.0,math: 90.0)
let c0 = MyClass.init()
c0.members.append(s0)
c0.members.append(s1)
c0.show()
// print(c0.getscore())
print("***********************")
// 我们看到打印 test lazy property了
print(c0.score)
原文链接:https://www.f2er.com/swift/322419.html