Swift语言属性存储属性访问存储属性Swift 语言入门很简单

Swift语言属性存储属性访问存储属性Swift 语言入门很简单

Swift语言快速入门v3.0

Swift语言快速入门v3.0

8.2  属性Swift语言属性存储属性访问存储属性Swift 语言入门很简单

在Objective-C中,属性是使用关键字@property关键字进行声明的内容。在Swift中,属性可以将值跟特定的类、结构或枚举关联。属性一般分为存储属性、计算属性和类型属性。本节将讲解对这些属性做详细的讲解。

8.2.1  存储属性Swift语言属性存储属性访问存储属性Swift 语言入门很简单

存储属性就是存储特定类中的一个常量或者变量。根据数据是否可变,分为常量存储属性和变量存储属性。

1.定义存储属性Swift语言属性存储属性访问存储属性Swift 语言入门很简单

常量存储属性使用let关键字定义(声明定义在一起进行,为了方便称为定义),其语法形式如下:

let 常量存储属性名:数据类型=初始值

变量存储属性可以使用var关键字定义,其语法形式如下:

var 变量存储属性名:数据类型=初始值

【示例8-3】以下代码定义类NewClass1,其中包含两个属性value1和value2,代码如下Swift语言属性存储属性访问存储属性Swift 语言入门很简单:

class NewClass1 {

let value1=20

var value2:Int=10

}

其中,value1使用let定义为常量存储属性,value2使用var定义为变量存储属性。在定义存储属性时,初始值是必不可少的,否则,就会出现错误。例如,以下的代码Swift语言属性存储属性访问存储属性Swift 语言入门很简单:

class NewClass1 {

let value1=20

var value2:Int

}

在此代码中,由于value2后面未加初始值,导致程序出现以下的错误信息Swift语言属性存储属性访问存储属性Swift 语言入门很简单:

Class ‘NewClass1’ has no initializers

2.访问存储属性

对于这些存储属性的访问,需要使用“.”点运算符。其语法形式如下:

对象名.常量存储属性名/变量存储属性名

【示例8-4】以下定义了3个存储属性firstValue、secondValue、thirdValue,然后进行访问。代码如下Swift语言属性存储属性访问存储属性Swift 语言入门很简单:

import Foundation

class NewClass{

let firstValue:Int = 0

let secondValue=200

var thirdValue:String=”Hello”

}

let newclass=NewClass()

//存储属性的访问Swift语言属性存储属性访问存储属性Swift 语言入门很简单

println(“firstValue=\(newclass.firstValue)”)

println(“secondValue=\(newclass.secondValue)”)

println(“thirdValue=\(newclass.thirdValue)”)

运行结果如下所示Swift语言属性存储属性访问存储属性Swift 语言入门很简单:

firstValue=0

secondValue=200

thirdValue=Hello

Program ended with exit code: 0

注意:对存储属性进行访问时,只可以对在自己类中定义的存储属性进行访问,否则就会出现错误,代码如下:

import Foundation

class NewClass1 {

var class1Value=10

}

class NewClass2 {

var class2Value=10

}

let newclass1=NewClass1()

println(newclass1.class1Value)

println(newclass1.class2Value)

在此代码中,由于class2Value存储属性是在NewClass2类中定义的,而不是NewClass1中定义的,所以程序就会出现以下的错误信息Swift语言属性存储属性访问存储属性Swift 语言入门很简单:

‘NewClass1’ does not have a member named ‘class2Value’

存储属性除了可以使用“.”点运算符进行读取外,还可以对其进行修改。修存储改属性的一般语法形式如下:

对象名.存储属性=修改的内容

【示例8-5】以下代码就将secondValue的属性值”Hello”修改为了”Swift”,代码如下:

import Foundation

class NewClass{

var secondValue:String=”Hello”

}

let newclass=NewClass()

println(“修改前:secondValue=\(newclass.secondValue)”)

newclass.secondValue=”Swift”                                                                       //修改存储实现

println(“修改后:secondValue=\(newclass.secondValue)”)

运行结果如下所示:

修改前:secondValue=Hello

修改后:secondValue=Swift

Program ended with exit code: 0

注意:只有变量存储属性才可以进行属性修改,常量存储属性不可以进行属性修改。如以下的代码:

import Foundation

class NewClass{

let firstValue:Int = 0

}

let newclass=NewClass()

println(“修改前:firstValue=\(newclass.firstValue)”)

newclass.firstValue=100                                                                 //试图对属性firstValue的值进行修改

println(“修改后:\(newclass.firstValue)”)

由于在类中使用了let对存储属性进行了定义,其值是不可以进行修改的,所以出现了以下的错误信息:

Cannot assign to ‘firstValue’ in ‘newclass’

3.延迟存储属性

如果开发者只有在第一次调用存储属性时才能确定初始值,这时需要使用延迟存储属性实现。它的定义一般需要使用关键字lazy实现的,其语法形式如下:

lazy var 属性名:数据类型=初始内容

注意:在延迟存储属性中初始内容是不可以省去的。数据类型也是可以省去的,因为swift会根据初始内容自行判断数据类型。

【示例8-6】以下将使用lazy来定义一个延迟存储属性importer,代码如下:

import Foundation

class DataImporter {

var fileName = 123456

}

class DataManager {

 lazy var importer = DataImporter()

var data = [String]()

}

let manager = DataManager()

manager.data += [“Some more data”]

println(manager.data)

println(manager.importer.fileName)

在没有调用manager.importer.fileName时,实例的 importer属性还没有被创建。运行结果如下所示:

[Some more data]

123456

Program ended with exit code: 0

我们可以使用断点调试的方法对此代码进行调试,来查看它的运行结果。具体步骤如下:

(1)为几行关键代码添加断点,并再添加一行代码,来查看添加importer的值,如图8.2所示。

图8.2  添加断点

(2)单击运行按钮,此时会在第一个断点处出现一个蓝色的箭头,表示此行代码在运行。然后选择Debug|Continue命令,按下调试窗口工具栏中的Continue program execution按钮,查看程序的执行,其中,可以使用查看器来观察属性值的变化。属性查看器位于调试信息窗口左半部分,如图8.3所示。程序的执行,如图8.4所示。其中,看到的self、data、importer.storage(因为importer是延迟属性,为了和其他属性区分,所以在查看器上看到是importer.storage)等都是属性。它们会随程序的执行为改变。

 

图8.3  查看器位置

 

图8.4  调试

在此图中程序执行到第3步,也就是第三个图时,类DataManager的属性data初始化,但没有给importer.storage属性进行初始化,一直为nil,直到执行到第7步,即第7个图时,才为importer.storage属性的属性初始化。

在定义一个延迟存储属性时需要注意以下2点,

(1)定义一个延迟存储属性时除了lazy外,还需要使用var关键字,但是不能使用let关键字,否则程序就会出现错误,如以下代码:

class DataImporter {

var fileName = 123456

}

class DataManager {

 lazy let importer = DataImporter()

var data = [String]()

}

由于在定义延迟属性时使用了let关键字,所以导致程序出现了以下的错误:

‘lazy’ cannot be used on a let

(2)初始内容是不可以省去的,否则程序就会出现错误,如以下的代码,定义了一个没有初始值的延迟属性。代码如下:

class DataManager {

lazy var value:Int

}

由于在此代码中没有为value指定初始值,导致程序出现了以下的错误:

lazy properties must have an initializer

Swift语言属性存储属性访问存储属性Swift 语言入门很简单

Comments are closed.