importFoundation
//***********************************************************************************************
//1.Properties(属性)
//_______________________________________________________________________________________________
//介绍
//属性将值跟特定的类,结构或者枚举关联。存储属性存储常量或变量作为实例的一部分,计算属性计算一个值,计算属性可以用于类,结构体,枚举中,存储属性只能用在类和结构体中
//存储属性和计算属性通常用于特定类型的实例,但是属性也可以直接用于类型本身,这种属性称为类型属性
//此外,我们还可以定义属性监视器来监控属性的变化,以此来触发一个自定义的操作。属性监视器可以添加到自己写的属性上,也可以添加到从父类继承的属性上
//2.Stored Properties(存储属性)
//简单来说,一个存储属性就是存储在特定类或结构体的实例里的一个常量或变量,存储属性可以是变量存储属性(用关键字var定义),也可以是常量存储属性(用关键字let定义)
//_______________________________________________________________________________________________
structFixedLengthRange{ //FixedLengthRange的实例包含一个名为firstValue的变量存储属性和一个名为length的常量存储属性
varfirstValue:Int
letlength:Int
}
varrangeOfThreeItems =FixedLengthRange(firstValue:0,length:3)
rangeOfThreeItems.firstValue=6
//常量和存储属性
letrangeOfItems1 =FixedLengthRange(firstValue:0,length:4) //这里如果定义一个常量为类实例rangeOfItems1,那么不管属性是否为常量或者变量,属性都不可以再次修改
// rangeOfThreeItems1.firstValue = 6 //如果修改属性firstValue,系统报错。这样的原因是因为结构体属于值类型,所以在定义实例的时候如果为常量,那么所有的属性均为常量,如果是类这种引用类型,那么即使定义实例为常量,属性依旧可以是变量可修改
//延迟存储属性
//延迟存储属性是指当第一次被调用的时候才会计算其初始值的属性,在属性声明前使用@lazy来标示一个延迟存储属性
//注意必须将延迟存储属性声明为变量,因为属性的值在实例构造完成之前可能无法得到。而常量属性在构造的过程完成前必须要有初始值,因此无法声明为延迟属性
//延迟属性很有用,当属性的值依赖于在实例的构造过程结束前无法知道具体指的外部因素时,或者当属性的值需要大量计算时,可以只在需要计算的时候来计算它即可
classDataImporter{
/*
DataImporter是一个将外部文件中的数据导入的类。
这个类的初始化会消耗不少时间。
*/
varfileName ="data.txt" //这里提供数据导入功能
}
classDataManager{
@lazyvarimporter = DataImporter()
vardata = [String]() 这时提供数据管理功能
}
letmanager =DataManager()
manager.data+="some data"
manager.data"some more data" //DataImporter实例的importer属性还没有被创建
println(manager)
(importerfileName) //由于使用了@lazy,importer属性只有在第一次被访问时才被创建,例如访问他的fileName属性
//3.Computed Properties(计算属性)
//计算属性不直接存储值,而是提供一个getter来获取值,一个可选的setter来间接的设置其他属性或者变量的值
structPoint{ //Point表示一个坐标
varx =0.0
vary =0.0
}
structSize{ //Size表示长宽尺寸
varwidth =varheight =structRect{ //Rect表示一个有原点和尺寸的矩形
varorigin =Point()
varsize =Size()
varcenter:Point{ //Rect提供了一个名为center的计算属性
get{
letcenterX =origin.x+ (size.width/2)
letcenterY =y+ (height/returnPoint(x: centerX,y: centerY) 计算矩形的中心点
}
set(newCenter){
x= newCenter.x- (2)
y= newCenter.y- (2)
}
}
}
varsquare =Rect(origin:Point(x:0.0,y:0.0),size:Size(width:10.0,height:10.0))
letinitialSquareCenter =square.center
("(\(initialSquareCenter.x),.y)") 访问属性通过get获取计算属性的值
squarecenter=(x:15.0) //center属性通过set被设置为新的值
("square.origin is now at (\(originx),y))")
//便捷setter声明
structAlternativeRect{
Size()
varcenter:Point{
}
set{ //如果计算属性的setter没有定义表示新值的参数名,可以使用默认的newValue来便捷设置
x= newValue.2) 这里的newVlaue就是我们设置的set值
y= newValue.2)
}
}
}
//只读计算属性(只有getter没有setter的属性就叫只读计算属性)
Cuboid{ //只读计算属性可以省略get关键字和大括号
vardepth =varvolume:Double{
returnwidth*height*depth
}
}
letfourByFiveByTwo =Cuboid(width:4.0,216)">5.0,depth:2.0)
("the volume of fourByFiveByTwo isfourByFiveByTwovolume)" //4.Property Observers(属性监视器)
//属性监视器监控和响应属性值的变化,每次属性被设置值的时候都会调用属性监视器,甚至新的值和现在的值相同的时候也不例外
classStepCounter{
vartotalSteps:Int=0{
willSet(newTotalSteps){
("About to set totalSteps to\(newTotalSteps)")
}
didSet{
iftotalSteps> oldValue{
println("Added\(totalSteps- oldValue)steps")
}
}
}
}
letstepCounter =StepCounter()
stepCounter.totalSteps200
360
stepCountertotalSteps896 //每当StepCounter实例调用totalSteps属性的时候,属性监视器就会被触发运行
//5.Global and Local Variables(全局变量和局部变量)
//计算属性和属性监视器所描述的模式也可以用于全局变量和局部变量,全局变量是在函数、方法、闭包或任何类型之外定义的变量,局部变量是在函数、方法或闭包内部定义的变量
//全局的常量或变量都是延迟计算的,跟延迟存储属性相似,不同的地方在于,全局的常量或变量不需要标记@lazy特性;局部范围的常量或变量不会延迟计算
//6.Type Properties(类型属性)
//类型的属性属于一个特定类型实例,每次类型实例化后都拥有自己的一套属性值,实例之间的属性是相互独立的
//类型属性的语法(使用static来定义值类型的类型属性,使用class来定义类的类型属性)
structSomeStructure{
staticvarstoredTypeProperty ="some Value"
varcomputedTypeProperty:Int{
return9
}
}
enumSomeEnumeration{
classSomeClass{
class9
}
}
//获取和设置类型属性的值(和实例的属性一样,类型属性的访问也是通过点运算符来进行,但是类型属性是通过类型本身来获取和设置,而不是通过实例)
println(SomeClass.computedTypeProperty)
SomeStructure.computedTypeProperty)
SomeEnumeration.computedTypeProperty) 直接获取类型属性
SomeStructure.storedTypeProperty ="another Value" 直接修改类型属性
SomeStructure.storedTypeProperty)
AudioChannel{ //结构AudioChannel定义了2个存储型类型属性来实现上述功能
letthresholdLevel =10
varmaxInputLevelForAllChannels =0
varcurrentLevel:0{
didSet{ //属性currentLevel包含didSet属性监视器来检查每次新设置后的属性值,有如下两个检查
ifcurrentLevel>AudioChannel.thresholdLevel{ //第一个是thresholdLevel表示声音电平的最大上限阈值,它是一个取值为10的常量,对所有实例都可见,如果声音电平高于10,则取最大上限值10
currentLevel=AudioChannel.thresholdLevel
}
.maxInputLevelForAllChannels{ //第二个类型属性是变量存储型属性maxInputLevelForAllChannels,它用来表示所有AudioChannel实例的电平值的最大值,初始值是0
AudioChannel.maxInputLevelForAllChannels =currentLevel
}
}
}
}
varleftChannel =AudioChannel()
rightChannel =() //可以使用结构体AudioChannel来创建表示立体声系统的两个声道leftChannel和rightChannel
leftChannel.currentLevel7
AudioChannel.maxInputLevelForAllChannels) 直接访问属性不需要实例,这就是类型属性
rightChannel11
(rightChannel)
AudioChannel.maxInputLevelForAllChannels)
转载:http://blog.csdn.net/u013096857/article/details/37871677