Swift 属性(九)

Swift 属性(九),第1张

概述属性 (Properties) 1.存储属性 存储在类或结构体的实例中的一个变量或常量,可以在定义的时候赋值,也可以在构造过程时候赋值 [objc]  view plain copy // length定义为常量,在创建实例的时候赋值,之后就无法再修改了   struct FixedLengthRange {       var firstValue: Int       let length:  属性 (PropertIEs)

1.存储属性 存储在类或结构体的实例中的一个变量或常量,可以在定义的时候赋值,也可以在构造过程时候赋值
[objc] view plain copy //length定义为常量,在创建实例的时候赋值,之后就无法再修改了 structFixedLengthRange{ varfirstValue:Int letlength:Int } varrangeOfThreeItems=FixedLengthRange(firstValue:0,length:3) //therangerepresentsintegervalues0,1,and2 rangeOfThreeItems.firstValue=6 //therangeNowrepresentsintegervalues6,7,and8 2.常量 创建一个结构体的实例并赋值给一个常量,就无法再修改实例的任何属性了,即使有定义变量属性,因为结构体属于值类型,当值类型的实例被声明为常量的时候,所有的属性也就成了常量,跟引用类型的类不一样,类赋值给常量后,仍然可以修改实例的属性
letrangeOfFourItems=FixedLengthRange(firstValue:0,0); background-color:inherit">length:4) //thisrangerepresentsintegervalues0,2,and3 rangeOfFourItems.firstValue=6 //thiswillreportanerror,eventhoughtfirstValueisavariableproperty 3.延迟存储属性 当第一次被调用的时候才会计算其初始值,使用@lazy标志,属性的值在实例构造完成之前可能为空,而常量要求构造完成之前必须有初始值,所以延迟属性必须是变量
//Dataimporter在初始化的时候需要消耗不少时间,因为可能要打开文件并读取文件内容,所以在创建DataManager的时候不需要创建Dataimporter实例,而是当用到才创建 classDataimporter{ /* Dataimporterisaclasstoimportdatafromanexternalfile. Theclassisassumedtotakeanon-trivialamountoftimetoinitialize. */ varfilename="data.txt" //theDataimporterclasswouldprovIDedataimportingfunctionalityhere classDataManager{ @lazyvarimporter=Dataimporter() vardata=String[]() //theDataManagerclasswouldprovIDedatamanagementfunctionalityhere letmanager=DataManager() manager.data+="Somedata" manager.data+="Somemoredata" //theDataimporterinstancefortheimporterpropertyhasnotyetbeencreated 4.计算属性 计算属性不直接存储值,提供一个getter来获取,可选的setter来设置
structPoint{ varx=0.0,y=0.0 structSize{ varwIDth=0.0,height=0.0 } structRect{ varorigin=Point() varsize=Size() varcenter:Point{ get{ letcenterX=origin.x+(size.wIDth/2) letcenterY=origin.y+(size.height/2) returnPoint(x:centerX,0); background-color:inherit">y:centerY) set(newCenter){ origin.x=newCenter.x-(size.wIDth/2) origin.y=newCenter.y-(size.height/2) varsquare=Rect(origin:Point(x:0.0,0); background-color:inherit">y:0.0), size:Size(wIDth:10.0,0); background-color:inherit">height:10.0)) letinitialSquareCenter=square.center square.center=Point(x:15.0,0); background-color:inherit">y:15.0) println("square.originisNowat(\(square.origin.x),\(square.origin.y))") //prints"square.originisNowat(10.0,10.0)" 5.便捷setter声明 如果setter没有定义参数名,则使用默认名称 newValue
structAlternativeRect{ set{ origin.x=newValue.x-(size.wIDth/2) origin.y=newValue.y-(size.height/2) } 6.只读计算属性 只有getter没有setter的计算属性,总是返回一个值,通过点运算符访问,不能赋新值
structCuboID{ varwIDth=0.0,height=0.0,depth=0.0 volume:Double{ returnwIDth*height*depth letfourByFiveByTwo=CuboID(wIDth:4.0,0); background-color:inherit">height:5.0,0); background-color:inherit">depth:2.0) println("thevolumeoffourByFiveByTwois\(fourByFiveByTwo.volume)") //prints"thevolumeoffourByFiveByTwois40.0" 7.属性监视器

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

wilSet 在设置新值前调用

didSet 新的值被设定后调用
willSet会将新值作为固定参数传入,如果不指定参数,默认使用newValue,didSet会将就值作为参数传入,不指定的话默认参数名为oldValue,如果在didSet监视器为属性设值,那这个值会替换监视器之前设置的值
willSet和didSet监视器不会在属性初始化的时候调用,只会在属性初始化之后的其他地方比如被设置的时候调用
classStepCounter{ totalSteps:Int=0{ willSet(newTotalSteps){ println("AbouttosettotalStepsto\(newTotalSteps)") dIDSet{ iftotalSteps>oldValue{ println("Added\(totalSteps-oldValue)steps") letstepCounter=StepCounter() stepCounter.totalSteps=200 //AbouttosettotalStepsto200 //Added200steps stepCounter.totalSteps=360 //AbouttosettotalStepsto360 //Added160steps stepCounter.totalSteps=896 //AbouttosettotalStepsto896 //Added536steps 8.全局变量和局部变量 全局变量是相对于全局的,在函数,方法,闭包或任何类型之外定义的变量,局部变量是在函数,方法或闭包内部定义的变量,全局变量跟延迟存储属性一样,但不需要@lazy修饰

9.类型属性 类型属性语法
使用关键字static定义值类型的类型属性,class定义类
structSomeStructure{ staticvarstoredTypeProperty="Somevalue." staticvarcomputedTypeProperty:Int{ //returnanIntvaluehere enumSomeEnumeration{ classSomeClass{ classvarcomputedTypeProperty:Int{ //returnanIntvaluehere }
获取和设置类型属性的值
类型属性的访问是通过点运算符 *** 作
println(SomeClass.computedTypeProperty) //prints"42" println(SomeStructure.storedTypeProperty) //prints"Somevalue." SomeStructure.storedTypeProperty="Anothervalue." println(SomeStructure.storedTypeProperty) //prints"Anothervalue."
以下是另一个比较完整的例子
structAudioChannel{ staticletthresholdLevel=10 staticvarmaxinputLevelForAllChannels=0 currentLevel:Int=0{ dIDSet{ ifcurrentLevel>AudioChannel.thresholdLevel{ //capthenewaudioleveltothethresholdlevel currentLevel=AudioChannel.thresholdLevel ifcurrentLevel>AudioChannel.maxinputLevelForAllChannels{ //storethisasthenewoverallmaximuminputlevel AudioChannel.maxinputLevelForAllChannels=currentLevel varleftChannel=AudioChannel() varrightChannel=AudioChannel() leftChannel.currentLevel=7 println(leftChannel.currentLevel) //prints"7" println(AudioChannel.maxinputLevelForAllChannels) rightChannel.currentLevel=11 println(rightChannel.currentLevel) //prints"10" //prints"10" 总结

以上是内存溢出为你收集整理的Swift 属性(九)全部内容,希望文章能够帮你解决Swift 属性(九)所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1081811.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-27
下一篇 2022-05-27

发表评论

登录后才能评论

评论列表(0条)

保存