码迷,mamicode.com
首页 > 其他好文 > 详细

九、属性 Properties

时间:2015-01-15 18:09:53      阅读:142      评论:0      收藏:0      [点我收藏+]

标签:

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 = 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 = 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 = [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

标签:

原文地址:http://www.cnblogs.com/actionke/p/4226753.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!