Swift 属性(九)

前端之家收集整理的这篇文章主要介绍了Swift 属性(九)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
属性 (Properties)

1.存储属性

存储在类或结构体的实例中的一个变量或常量,可以在定义的时候赋值,也可以在构造过程时候赋值
[objc] view plain copy
  1. //length定义为常量,在创建实例的时候赋值,之后就无法再修改
  2. structFixedLengthRange{
  3. varfirstValue:Int
  4. letlength:Int
  5. }
  6. varrangeOfThreeItems=FixedLengthRange(firstValue:0,length:3)
  7. //therangerepresentsintegervalues0,1,and2
  8. rangeOfThreeItems.firstValue=6
  9. //therangenowrepresentsintegervalues6,7,and8

2.常量

创建一个结构体的实例并赋值给一个常量,就无法再修改实例的任何属性了,即使有定义变量属性,因为结构体属于值类型,当值类型的实例被声明为常量的时候,所有的属性也就成了常量,跟引用类型的类不一样,类赋值给常量后,仍然可以修改实例的属性
    letrangeOfFourItems=FixedLengthRange(firstValue:0,0); background-color:inherit">length:4)
  1. //thisrangerepresentsintegervalues0,2,and3
  2. rangeOfFourItems.firstValue=6
  3. //thiswillreportanerror,eventhoughtfirstValueisavariableproperty

3.延迟存储属性

当第一次被调用的时候才会计算其初始值,使用@lazy标志,属性的值在实例构造完成之前可能为空,而常量要求构造完成之前必须有初始值,所以延迟属性必须是变量
    //DataImporter在初始化的时候需要消耗不少时间,因为可能要打开文件并读取文件内容,所以在创建DataManager的时候不需要创建DataImporter实例,而是当用到才创建
  1. classDataImporter{
  2. /*
  3. DataImporterisaclasstoimportdatafromanexternalfile.
  4. Theclassisassumedtotakeanon-trivialamountoftimetoinitialize.
  5. */
  6. varfileName="data.txt"
  7. //theDataImporterclasswouldprovidedataimportingfunctionalityhere
  8. classDataManager{
  9. @lazyvarimporter=DataImporter()
  10. vardata=String[]()
  11. //theDataManagerclasswouldprovidedatamanagementfunctionalityhere
  12. letmanager=DataManager()
  13. manager.data+="Somedata"
  14. manager.data+="Somemoredata"
  15. //theDataImporterinstancefortheimporterpropertyhasnotyetbeencreated

4.计算属性

计算属性不直接存储值,提供一个getter来获取,可选的setter来设置
    structPoint{
  1. varx=0.0,y=0.0
  2. structSize{
  3. varwidth=0.0,height=0.0
  4. }
  5. structRect{
  6. varorigin=Point()
  7. varsize=Size()
  8. varcenter:Point{
  9. get{
  10. letcenterX=origin.x+(size.width/2)
  11. letcenterY=origin.y+(size.height/2)
  12. returnPoint(x:centerX,0); background-color:inherit">y:centerY)
  13. set(newCenter){
  14. origin.x=newCenter.x-(size.width/2)
  15. origin.y=newCenter.y-(size.height/2)
  16. varsquare=Rect(origin:Point(x:0.0,0); background-color:inherit">y:0.0),
  17. size:Size(width:10.0,0); background-color:inherit">height:10.0))
  18. letinitialSquareCenter=square.center
  19. square.center=Point(x:15.0,0); background-color:inherit">y:15.0)
  20. println("square.originisnowat(\(square.origin.x),\(square.origin.y))")
  21. //prints"square.originisnowat(10.0,10.0)"

5.便捷setter声明

如果setter没有定义参数名,则使用默认名称 newValue
    structAlternativeRect{
  1. set{
  2. origin.x=newValue.x-(size.width/2)
  3. origin.y=newValue.y-(size.height/2)
  4. }

6.只读计算属性

只有getter没有setter的计算属性,总是返回一个值,通过点运算符访问,不能赋新值
    structCuboid{
  1. varwidth=0.0,height=0.0,depth=0.0
  2. volume:Double{
  3. returnwidth*height*depth
  4. letfourByFiveByTwo=Cuboid(width:4.0,0); background-color:inherit">height:5.0,0); background-color:inherit">depth:2.0)
  5. println("thevolumeoffourByFiveByTwois\(fourByFiveByTwo.volume)")
  6. //prints"thevolumeoffourByFiveByTwois40.0"

7.属性监视器

监控属性值的变化,在属性被设置新值的时候调用,即使新值与原有相同,可以为延迟属性添加监视器,不需要为无法重载的计算属性添加监视器,因为可以通过setter直接监控

wilSet 在设置新值前调用

didSet 新的值被设定后调用
willSet会将新值作为固定参数传入,如果不指定参数,默认使用newValue,didSet会将就值作为参数传入,不指定的话默认参数名为oldValue,如果在didSet监视器为属性设值,那这个值会替换监视器之前设置的值
willSet和didSet监视器不会在属性初始化的时候调用,只会在属性初始化之后的其他地方比如被设置的时候调用
    classStepCounter{
  1. totalSteps:Int=0{
  2. willSet(newTotalSteps){
  3. println("AbouttosettotalStepsto\(newTotalSteps)")
  4. didSet{
  5. iftotalSteps>oldValue{
  6. println("Added\(totalSteps-oldValue)steps")
  7. letstepCounter=StepCounter()
  8. stepCounter.totalSteps=200
  9. //AbouttosettotalStepsto200
  10. //Added200steps
  11. stepCounter.totalSteps=360
  12. //AbouttosettotalStepsto360
  13. //Added160steps
  14. stepCounter.totalSteps=896
  15. //AbouttosettotalStepsto896
  16. //Added536steps

8.全局变量和局部变量

全局变量是相对于全局的,在函数,方法,闭包或任何类型之外定义的变量,局部变量是在函数,方法或闭包内部定义的变量,全局变量跟延迟存储属性一样,但不需要@lazy修饰

9.类型属性

类型属性语法
使用关键字static定义值类型的类型属性,class定义类
    structSomeStructure{
  1. staticvarstoredTypeProperty="Somevalue."
  2. staticvarcomputedTypeProperty:Int{
  3. //returnanIntvaluehere
  4. enumSomeEnumeration{
  5. classSomeClass{
  6. classvarcomputedTypeProperty:Int{
  7. //returnanIntvaluehere
  8. }

获取和设置类型属性的值
类型属性的访问是通过点运算符操作
    println(SomeClass.computedTypeProperty)
  1. //prints"42"
  2. println(SomeStructure.storedTypeProperty)
  3. //prints"Somevalue."
  4. SomeStructure.storedTypeProperty="Anothervalue."
  5. println(SomeStructure.storedTypeProperty)
  6. //prints"Anothervalue."

以下是另一个比较完整的例子
    structAudioChannel{
  1. staticletthresholdLevel=10
  2. staticvarmaxInputLevelForAllChannels=0
  3. currentLevel:Int=0{
  4. didSet{
  5. ifcurrentLevel>AudioChannel.thresholdLevel{
  6. //capthenewaudioleveltothethresholdlevel
  7. currentLevel=AudioChannel.thresholdLevel
  8. ifcurrentLevel>AudioChannel.maxInputLevelForAllChannels{
  9. //storethisasthenewoverallmaximuminputlevel
  10. AudioChannel.maxInputLevelForAllChannels=currentLevel
  11. varleftChannel=AudioChannel()
  12. varrightChannel=AudioChannel()
  13. leftChannel.currentLevel=7
  14. println(leftChannel.currentLevel)
  15. //prints"7"
  16. println(AudioChannel.maxInputLevelForAllChannels)
  17. rightChannel.currentLevel=11
  18. println(rightChannel.currentLevel)
  19. //prints"10"
  20. //prints"10"
原文链接:https://www.f2er.com/swift/325172.html

猜你在找的Swift相关文章