因为DataManager实例可能并不需要立即管理从文件中引用的数据,所以在DataManager实例被创建时,并不需要马上就创建一个新的DataImporter实例。这就使得当DataImporter实例在需要时才被创建理所当然起来。
因为被声明为@lazy属性,DataImporter的实例importer只有在当它在第一次被访问时才被创建。例如它的fileName属性需要被访问时:
复制代码
println(manager.importer.fileName)
// the DataImporter instance for the importer property has now been created
// prints "data.txt
存储属性与实例变量
如果你使用过Objective-C,你应该知道它提供两种方式来存储作为类实例一部分的值与引用。除了属性,你可以使用实例变量作为属性值的后备存储
Swift使用一个单一属性声明来统一这些概念。一个Swift属性没有与之相符的实例变量,并且属性的后备存储也不能直接访问。这防止了在不通上下文中访问值的混淆,并且简化属性声明成为一个单一的、最终的语句。关于属性的所有信息-包含名称、类型和内存管理等-作为类型定义的一部分而定义。
2、计算属性
除了存储属性,类、结构和枚举能够定义计算属性。计算属性并不存储值,它提供getter和可选的setter来间接地获取和设置其它的属性和值。
复制代码
struct Point {
var x = 0.0, y = 0.0
}
struct Size {
var width = 0.0, height = 0.0
}
struct Rect {
var origin = Point()
var size = Size()
var center: Point {
get {
let centerX = origin.x + (size.width / 2)
let centerY = origin.y + (size.height / 2)
return Point(x: centerX, y: centerY)
}
set(newCenter) {
origin.x = newCenter.x - (size.width / 2)
origin.y = newCenter.y - (size.height / 2)
}
}
}
var square = Rect(origin: Point(x: 0.0, y: 0.0),size: Size(width: 10.0, height: 10.0))
let initialSquareCenter = square.center
square.center = Point(x: 15.0, y: 15.0)
println("square.origin is now at ((square.origin.x), (square.origin.y))")
// prints "square.origin is now at (10.0, 10.0)"
这个例子定义了三个处理几何图形的结构:








