首页 > 代码库 > 九、属性 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