首页 > 代码库 > 九、属性 Properties
九、属性 Properties
1. Stored Properties
1.1 概述
classes, structures, and enumerations都可以定义 Stored Properties
Stored Properties 这是最简单的属性类型。例如:
struct FixedLengthRange { var firstValue: Int let length: Int } var rangeOfThreeItems = FixedLengthRange(firstValue: 0, length: 3) // the range represents integer values 0, 1, and 2 rangeOfThreeItems.firstValue = http://www.mamicode.com/6 // the range now represents integer values 6, 7, and 8
其中,length 为 let 型,一旦初始化后就不能改变。
1.2. 常量结构体实例的 Stored Properties (Stored Properties of Constant Structure Instances)
如果你创建了一个结构体的实例,并将它赋值为一个常量constant,那么即使这个结构体的属性为变量类型,你也不能修改这个属性的值。
let rangeOfFourItems = FixedLengthRange(firstValue: 0, length: 4) // this range represents integer values 0, 1, 2, and 3 rangeOfFourItems.firstValue = http://www.mamicode.com/6 // this will report an error, even though firstValue is a variable property
上面的代码中,rangeOfFourItems 的属性的值不能修改。
因为结构体是值类型,如果结构体为Constant,那么他的所有属性也会表现为Constant。
这与类是不同的,因为类是引用类型,如果一个类的实例为Constant,你仍然可以更改这个实例variable类型的属性的值。
1.3. 属性的懒加载 Lazy Stored Properties
Lazy Stored Properties 指 一个属性的初始化值不会马上计算出来,而是等到第一次使用时才计算。
当需要指明某个属性使用懒加载时,可以在定义时加上lazy
关键字。
注意:懒加载属性只有var类型的变量才能使用,因为它可能不会马上初始化。但是let类型不能使用懒加载,因为它定义时就必须有值。
class DataImporter {//假设该类执行耗时的操作 var fileName = "data.txt" } class DataManager { lazy var importer = DataImporter() var data =http://www.mamicode.com/ [String]() // the DataManager class would provide data management functionality here } let manager = DataManager() manager.data.append("Some data") manager.data.append("Some more data") // the DataImporter instance for the importer property has not yet been created
在上面的例子中,只有当importer属性第一次被使用 is first accessed ,DataImporter 实例才会被创建。
println(manager.importer.fileName) // the DataImporter instance for the importer property has now been created // prints "data.txt"
2. Computed Properties
2.1 概述
classes, structures, and enumerations 都可以定义 computed properties。
computed properties 并不真的存储一个值,相反的,它提供了一个getter和一个可选的setter,间接的检索和设置 retrieve and set 其他属性和值。
struct Point { var x = 0.0, y = 0.0 } struct Size { var width = 0.0, height = 0.0 } struct Rect { var origin = Point() // Stored Property var size = Size() var center: Point { // Computed Property 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)"
2.2 速记Setter定义 Shorthand Setter Declaration
九、属性 Properties