From 1a6ea959d691f51a9e90227add0e428683596f95 Mon Sep 17 00:00:00 2001 From: Shiny Zhu Date: Sat, 7 Jun 2014 06:47:16 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E6=88=90=E2=80=9C=E5=AD=98=E5=82=A8?= =?UTF-8?q?=E5=B1=9E=E6=80=A7=E2=80=9D=E4=B8=AD=E7=9A=84=E4=B8=A4=E8=8A=82?= =?UTF-8?q?=EF=BC=8C=E5=BE=85=E4=BF=AE=E8=AE=A2=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/chapter2/10_Properties.md | 48 ++++++++++++++++++++++++++++++-- 1 file changed, 46 insertions(+), 2 deletions(-) diff --git a/source/chapter2/10_Properties.md b/source/chapter2/10_Properties.md index ea52defb..0decc4b6 100644 --- a/source/chapter2/10_Properties.md +++ b/source/chapter2/10_Properties.md @@ -1,5 +1,49 @@ # 属性 (Properties) -**属性**将值跟特定的类、结构或枚举关联。一种是存储属性,把常量和变量的值作为实例的一部分,一种是计算属性,它计算一个值。计算属性可以用于类、结构和枚举里,存储属性只能用于类和结构。 +**属性**将值跟特定的类、结构或枚举关联。一种是存储属性,把常量或变量的值作为实例的一部分,一种是计算属性,它计算一个值。计算属性可以用于类、结构和枚举里,存储属性只能用于类和结构。 -存储属性和计算属性通常用于特定类型的实例,但是,属性也可以直接用于类型本身,这种属性称为类属性。 \ No newline at end of file +存储属性和计算属性通常用于特定类型的实例,但是,属性也可以直接用于类型本身,这种属性称为类属性。 + +另外,还可以定义属性观察者来监控属性值的变化,以此来触发一个自定义的操作。属性观察者可以添加到自己写的存储属性上,也可以添加到从父类继承的属性上。 + +## 存储属性 + +简单来说,一个存储属性就是一个特定类型实例里表示常量或变量的部分,存储属性可以是*变量存储属性*(用关键字`var`定义),也可以是*常量存储属性*(用关键字`let`定义)。 + +可以在定义存储属性的时候指定默认值,详见[默认属性值](#)一节。也可以在初始化阶段设置或修改存储属性的值,甚至修改常量存储属性的值,详见[在初始化阶段修改常量存储属性](#)一节。 + +下面的例子定义了一个名为`FixedLengthRange`的结构体,表示一个在创建后无法修改整数范围的类型: + +``` +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” + +``` + +`FixedLengthRange`的实例包含一个名为`firstValue`的变量存储属性和一个名为`length`的常量存储属性。在上面的例子中,`length`在创建实例的时候被赋值,因为它是一个常量存储属性,所以再无法修改它的值。 + +### 常量和存储属性 + +如果创建了一个结构体的实例并赋值给一个常量,则无法修改实例的任何属性,即使定义了变量存储属性: + +``` +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 thought firstValue is a variable property” + +``` + +因为`rangeOfFourItems`声明成了常量(用`let`关键字),即使`firstValue`是一个变量属性,也无法再修改属性它的值。 + +这种行为是由于结构体(struct)属于*值类型*。当值类型的实例被声明为常量的时候,它的所有属性也就成了常量。 + +属于*引用类型*的类(class)则不一样,把一个引用类型的实例赋给一个常量后,仍然可以修改实例的变量属性。 + +### 延迟存储属性 \ No newline at end of file