|
详解Swift编程中的方法与属性的概念 |
|
|
详解Swift编程中的方法与属性的概念
方法
在Swift中特定类型的相关联功能被称为方法。在ObjectiveC中类是用来定义方法,其中作为Swift语言为用户提供了灵活性,类,结构和枚举中可以定义使用方法。
实例方法
在Swift语言,类,结构和枚举实例通过实例方法访问。
1.实例方法提供的功能
2.访问和修改实例属性
3.函数关联实例的需要
实例方法可以写在花括号{}内。它隐含的访问方法和类实例的属性。当该类型指定具体实例它调用获得访问该特定实例。
语法
复制代码代码如下:
funcfuncname(Parameters)->returntype
{Statement1Statement2---StatementN
returnparameters
}
示例
复制代码代码如下:
classcalculations{leta:Intletb:Intletres:Int
init(a:Int,b:Int){self.a=a
self.b=b
res=a+b
}
functot(c:Int)->Int{returnres-c
}
funcresult(){
println("Resultis:\(tot(20))")
println("Resultis:\(tot(50))")}}letpri=calculations(a:600,b:300)
pri.result()
当我们使用playground运行上面的程序,得到以下结果
Resultis:880Resultis:850
Calculations类定义了两个实例方法:
init()被定义为两个数a和b相加,并将其结果存储在''res''
tot()用于通过从“res”值减去''c''
最后,调用打印的计算a和b的值方法.实例方法以"."语法访问
局部和外部参数名称
Swift函数描述了局部和全局变量声明。同样,Swift方法的命名规则也类似ObjectiveC。但是局部和全局参数名称声明的特性对于函数和方法不同。swift第一个参数是由介词名称''with'',''for''和''by''访问命名规则。
Swift提供声明作为局数参数名称,其它参数名称为全局参数名,第一参数是方法名称。在这里,“no1”方法作为局部参数名来声明。''no2''用于全局声明,并通过该程序访问。
复制代码代码如下:
classdivision{varcount:Int=0
funcincrementBy(no1:Int,no2:Int){
count=no1/no2
println(count)}}letcounter=division()
counter.incrementBy(1800,no2:3)
counter.incrementBy(1600,no2:5)
counter.incrementBy(11000,no2:3)
当我们使用playground运行上面的程序,得到以下结果
6003203666
外部参数名称使用#和_符号
尽管Swift方法提供第一个参数名称作为局部声明,用户必须提供以修改参数名称从局部到全局声明。这可以通过''#''符号前缀使用第一参数名来完成。通过这样做,第一参数可以作为全局在整个模块访问。
当用户需要使用外部名称访问在后面的参数名中,方法的名字使用“_”符号覆盖。
复制代码代码如下:
classmultiplication{varcount:Int=0
funcincrementBy(#no1:Int,no2:Int){
count=no1no2
println(count)}}letcounter=multipwww.visa158.comlication()
counter.incrementBy(no1:800,no2:3)
counter.incrementBy(no1:100,no2:5)
counter.incrementBy(no1:15000,no2:3)
当我们使用playground运行上面的程序,得到以下结果
240050045000
在方法中的Self属性
方法有一个隐式属性被称为“self”,所有定义的类型实例所都有。“self”属性被用于表示当前的实例定义的方法。
复制代码代码如下:
classcalculations{leta:Intletb:Intletres:Int
init(a:Int,b:Int){self.a=a
self.b=b
res=a+b
println("InsideSelfBlock:\(res)")}
functot(c:Int)->Int{returnres-c
}
funcresult(){
println("Resultis:\(tot(20))")
println("Resultis:\(tot(50))")}}letpri=calculations(a:600,b:300)letsum=calculwww.hunanwang.netations(a:1200,b:300)
pri.result()
sum.result()
当我们使用playground运行上面的程序,得到以下结果
InsideSelfBlock:900InsideSelfBlock:1500Resultis:880Resultis:850Resultis:1480Resultis:1450
修改的实例方法值类型
在Swift语言结构和枚举和值类型不能由它的实例方法来改变。然而,swift语言通过“变异”行为提供了灵活修改值类型。突变将使得在实例方法中的任何变化,将方法执行之后变化返回到原来的形式。此外,由“selft”属性的新实例其隐式函数创建,执行之后将取代现有的方法
复制代码代码如下:
structarea{varlength=1varbreadth=1
funcarea()->Int{returnlengthbreadth
}
mutatingfuncscaleBy(res:Int){
length=res
breadth=res
println(length)
println(breadth)}}varval=area(length:3,breadth:5)
val.scaleBy(3)
val.scaleBy(30)
val.scaleBy(300)
当我们使用playground运行上面的程序,得到以下结果
91527045081000135000
Self属性的不同诱变方法
突变方法结合“self”属性分配给新实例所定义的方法。
复制代码代码如下:
structarea{varlength=1varbreadth=1
funcarea()->Int{returnlengthbreadth
}
mutatingfuncscaleBy(res:Int){self.length=res
self.breadth=res
println(length)
println(breadth)}}varval=area(length:3,breadth:5)
val.scaleBy(13)
当我们使用playground运行上面的程序,得到以下结果
3965
类型方法
当方法的特定实例调用,它调用一个实例方法并且当方法调用特定类型的方法的一个被定义为"类型方法“。类型方法“类”是由“func”关键字和结构定义,和枚举型方法使用“func”关键字之前的“static”关键字定义。
类型方法调用,是通过访问''.''而不是调用特定实例的方法,例子和语法如下:
复制代码代码如下:
classMath{classfuncabs(number:Int)->Int{ifnumber<0{return(-number)}else{returnnumber
}}}structabsno
{staticfuncabs(number:Int)->Int{ifnumber<0{return(-number)}else{returnnumber
}}}letno=Math.abs(-35)letnum=absno.abs(-5)
println(no)
println(num)
当我们使用playground运行上面的程序,得到以下结果
355
属性
Swift语言提供了类,枚举或结构相关联值的属性。属性可以被进一步分为存储属性和计算属性。
存储性能和计算属性的区别
这两种存储和计算属性与实例类型相关联。当属性与它的类型值相关联,那么它定义为“类型属性”。存储和计算的属性通常与一个特定类型的实例相关联。然而,属性也可以与类型本身相关联。这样的属性是已知的类型的属性。属性观察者也被使用
观察存储的属性值
观察子类从父继承而得的属性
存储属性
Swift介绍存储的属性概念用来存储常量和变量的实例。常量存储的属性由''let''关键字定义和存储变量的属性由“var”关键字定义。
在定义存储的属性提供了“默认值”
在初始化期间用户可以初始化和修改初始值
复制代码代码如下:
structNumber{vardigits:Intletpi=3.1415}varn=Number(digits:12345)
n.digits=67
println("\(n.digits)")
println("\(n.pi)")
当我们使用playground运行上面的程序,得到以下结果
673.1415
考虑在上面的代码,如下面的一行:
复制代码代码如下:
letpi=3.1415
这里,可变圆周率被初始化为存储属性值使用所述实例pi=3.1415.所以,每当实例被称为将持有单独的值是:3.1415。
另一种方法,已存储的属性可能常量结构。这样结构的整个实例将被认为是“常量属性的存储”。
复制代码代码如下:
structNumber{vardigits:Intletnumbers=3.1415}varn=Number(digits:12345)
n.digits=67
println("\(n.digits)")
println("\(n.numbers)")
n.numbers=8.7
当我们使用playground运行上面的程序,得到以下结果
error:cannotassignto''numbers''in''n''n.numbers=8.7
重新初始化''数字''为8.7,它将返回指示“数字''''被声明为常数的错误消息。
懒存储属性
Swift提供了所谓的“懒存储属性'',当变量被首次初始化它不会计算初始值.“lazy”修饰符的变量声明之前,把它作为一个懒存储属性。
延迟属性被使用:
要延迟对象的创建。
当属性是依赖于一个类的其他部分,即:尚未知道
复制代码代码如下:
classsample{
lazyvarno=number()//`var`declarationisrequired.}classnumber{varname="Swift"}varfirstsample=sample()
println(firstsample.no.name)
当我们使用playground运行上面的程序,我们得到以下结果
Swift
实例变量
在ObjectiveC中,存储属性还必须有实例变量用于备份目的,存放在存储的属性声明的值。
Swift集成了这些概念成一个“存储的属性”声明。而不必有一个相应的实例变量和备份值''存储属性“,包含通过变量名一个位置定义的有关变量属性所有信息集成,数据类型和存储器管理功能。
计算属性
而不是存储计算的属性值提供了一个getter和一个可选的setter间接来检索和设置其他属性和值。
复制代码代码如下:
classsample{varno1=0.0,no2=0.0varlength=300.0,breadth=150.0varmiddle:(Double,Double){get{return(length/2,breadth/2)}set(axis){
no1=axis.0-(length/2)
no2=axis.1-(breadth/2)}}}varresult=sample()
println(result.middle)
result.middle=(0.0,10.0)
println(result.no1)
println(result.no2)
当我们使用playground运行上面的程序,我们得到以下结果
(150.0,75.0)-150.0-65.0
当计算的属性留下了新的值为未定义默认值将针对特定的变量来设置。
计算属性为只读属性
在计算属性只读属性被定义为getter,但不是setter。它总是用来返回一个值。变量通过使用''.''语法访问,但不能被设置为其他值。
复制代码代码如下:
classfilm{varhead=""varduration=0.0varmetaInfo:[String:String]{return["head":self.head,"duration":"\(self.duration)"]}}varmovie=film()
movie.head="SwiftProperties"
movie.duration=3.09
println(movie.metaInfo["head"]!)
println(movie.metaInfo["duration"]!)
当我们使用playground运行上面的程序,我们得到以下结果
SwiftProperties3.09
计算属性属性观察者
在Swift中使用属性观察者来观察和设置属性值响应。当每一次属性值设置属性观察者都被调用。除了懒存储属性,我们可以通过添加属性观察者“继承”属性“覆盖”方法。
在存放值之前-willset
存储新的值之后-didset
当一个属性被设置在初始化willset和didset观察者不能调用。
复制代码代码如下:
classSamplepgm{varcounter:Int=0{
willSet(newTotal){
println("TotalCounteris:\(newTotal)")}
didSet{ifcounter>oldValue{
println("NewlyAddedCounter\(counter-oldValue)")}}}}letNewCounter=Samplepgm()NewCounter.counter=100NewCounter.counter=800
当我们使用playground运行上面的程序,我们得到以下结果
TotalCounteris:100NewlyAddedCounter100TotalCounteris:800NewlyAddedCounter700
局部和全局变量
对于计算和观察属性局部和全局变量的声明。
类型属性
属性定义类型定义部分有大括号{},并且变量的范围也被前面所定义。要定义值类型使用“static”关键字以及类的类型使用“class”关键字。
语法
复制代码代码如下:
structStructname{staticvarstoredTypeProperty=""staticvarcomputedTypeProperty:Int{//returnanIntvaluehere}}enumEnumname{staticvarstoredTypeProperty=""staticvarcomputedTypeProperty:Int{//returnanIntvaluehere}}classClassname{classvarcomputedTypeProperty:Int{//returnanIntvaluehere}}
查询和设置属性
类似于实例属性类型属性查询和设置,只是使用“.”语法,而不用指向该实例的类型。
复制代码代码如下:
structStudMarks{staticletmarkCount=97staticvartotalCount=0varInternalMarks:Int=0{
didSet{ifInternalMarks>StudMarks.markCount{InternalMarks=StudMarks.markCount
}ifInternalMarks>StudMarks.totalCount{StudMarks.totalCount=InternalMarks}}}}varstud1Mark1=StudMarks()varstud1Mark2=StudMarks()
stud1Mark1.InternalMarks=98
println(stud1Mark1.InternalMarks)
stud1Mark2.InternalMarks=87
println(stud1Mark2.InternalMarks)
当我们使用playground运行上面的程序,我们得到以下结果
|
|
|
|
|
|
|
|
|
|
|