Swift语言计算属性设置值定义计算属性的关键字Swift语言入门很简单大学霸
Swift语言计算属性设置值定义计算属性的关键字Swift语言入门很简单大学霸
8.2.2 计算属性Swift语言计算属性设置值定义计算属性的关键字Swift语言入门很简单大学霸
除了存储属性外,类中还可以定义计算属性。计算属性不存储值,而是提供了一个getter和setter来分别进行获取值和设置其他属性的值。getter使用get关键字进行定义,其一般形式如下Swift语言计算属性设置值定义计算属性的关键字Swift语言入门很简单大学霸:
get{
…
return 某一属性值
}
setter使用set关键字进行定义,其一般语法形式如下Swift语言计算属性设置值定义计算属性的关键字Swift语言入门很简单大学霸:
set(参数名称){
…
属性值=某一个值
…
}
当然,它也可以没有参数名称。这种情况会后面的内容中讲解。在计算属性中同时包含了getter和setter,其一般定义形式如下:
var 属性名:数据类型{
get{
…
return 某一属性值
}
set(参数名称){
…
属性值=某一个值
…
}
}
【示例8-7】以下代码定义了一个类WalletClass,用来保存钱包中的金额,其默认单位为美元。为了方便用户以人民币为单位进行访问值和设置值,所以使用了计算属性cal。代码如下Swift语言计算属性设置值定义计算属性的关键字Swift语言入门很简单大学霸:
import Foundation
class WalletClass{
var money=0.0
var cal:Double{ //定义计算属性cal
get{ //定义getter
var RMB=money*6.1
return RMB //返回以人民币为单位的金额
}
set(RMB){ //定义setter
money=RMB/6.1 //返回以美元为单位的金额
}
}
}
var mywallet=WalletClass()
mywallet.cal=(20)
//输出
println(mywallet.cal)
println(mywallet.money)
运行结果如下所示:
20.0
3.27868852459016
Program ended with exit code: 0
注意:在使用计算属性时需要注意以下三点:
1.定义计算属性的关键字
在定义一个计算属性时,必须且只能使用var关键字,否则就会出现错误。以下的代码,将示例8-7的代码做了一些修改,代码如下Swift语言计算属性设置值定义计算属性的关键字Swift语言入门很简单大学霸:
class WalletClass{
var money=0.0
let cal:Double{
get{
var RMB=money*6.1
return RMB
}
set(RMB){
money=RMB/6.1
}
}
}
在此代码中定义一个计算属性,但是使用了let关键字,导致程序出现了以下的错误Swift语言计算属性设置值定义计算属性的关键字Swift语言入门很简单大学霸:
‘let’ declarations cannot be a computed property
2.数据类型
在定义计算属性时,一定要为属性指定一个明确的数据类型,否则就会出现错误提示。例如以下的代码,是将示例8-7中的代码做了一些修改。代码如下:
class WalletClass{
var money=0.0
var cal{ //没有设置cal的数据类型
get{
var RMB=money*6.1
return RMB
}
set(RMB){
money=RMB/6.1
}
}
}
在此代码中由于没有为计算属性指定一个明确的数据类型,导致程序出现了以下的错误信息:
Computed property must have an explicit type
3.set后面的参数类型
在使用计算属性时,set后面的参数类型要和返回值的类型相同,不需要再指定类型。否则,程序就会出现错误。如以下的代码,此代码是将示例8-7中的代码做了一下修改,代码如下:
class WalletClass{
var money=0.0
var cal:Double{ //没有设置cal的数据类型
get{
var RMB=money*6.1
return RMB
}
set(RMB:String){ //为参数定义了数据类型
money=RMB/6.1
}
}
}
在此代码中,对set后面的参数RMB指定了数据类型,导致程序出现了以下的错误:
Expected ‘)’ after setter value name
Expected ‘{‘ to start setter definition
4.没有定义参数名称
如果计算属性的setter没有定义表示新值的参数名,则可以使用默认名称newValue。
【示例8-8】以下代码就使用了newValue来实现了华氏温度和摄氏温度的转换。代码如下:
import Foundation
class DegreeClass{
var degree=0.0
var cal :Double{
get{
var centigradedegree=(degree-32)/1.8
return centigradedegree
}
set{
degree=1.8*newValue+32 //没有定义参数名称,可以使用默认的
}
}
}
var degreeClass=DegreeClass()
degreeClass.cal=(10.0)
println(degreeClass.cal)
println(degreeClass.degree)
运行结果如下所示:
10.0
50.0
Program ended with exit code: 0
4.定义参数名后不能使用默认参数名
在set后面如果定义了参数名称,就不能再使用Swift默认的参数名称newValue。否则,就会导致程序出现错误。如以下的代码,将示例8-8做了一些修改,代码如下:
import Foundation
class DegreeClass{
var degree=0.0
var cal :Double{
get{
var centigradedegree=(degree-32)/1.8
return centigradedegree
}
set(aaa){ //定义参数名称后,使用默认参数
degree=1.8*newValue+32
}
}
}
…
在此代码中,set后面定义了参数名称,但是又使用了默认的参数名称,导致程序出现了以下的错误:
Use of unresolved identifier ‘newValue’
5.setter和getter的省略
在计算属性中,如果只有一个getter,则称为只读计算属性。只读计算属性可以返回一个值,但不能设置新的值。
【示例8-9】以下将通过getter来获取名称的字符串。代码如下:
import Foundation
class PersonName{
var name:String=””
var returnName :String{
if (name.isEmpty) {
return “NULL”
}else{
return name
}
}
}
var personClass=PersonName()
println(“没有名字时\(personClass.returnName)”)
personClass.name=(“Tom”)
println(“有名字时\(personClass.returnName)”)
在此代码中,当刚创建实例PersonName后,就去访问returnName。由于name默认为空,所以会返回字符串”NULL”。再对name赋值后,再一次访问returnName。由于name不为空,所以会返回name的内容。运行结果如下所示:
没有名字时NULL
有名字时Tom
Program ended with exit code: 0
注意:1.在只读计算属性中,可以将get关键字和花括号去掉。2.在C#等其他语言中可以将属性分为只读属性(只有getter)、只写属性(只有setter)和可读可写属性。但是在Swift中就不同了,只有只读计算属性和可读可写计算属性两个。没有只写计算属性,否则程序就会出现错误,如以下的代码:
class PersonName{
var name:String=””
var setName :String{
set{
…
}
}
在此代码中定义了一个只写计算属性,导致程序出现了以下的错误:
Variable with a setter must also have a getter
Swift语言计算属性设置值定义计算属性的关键字Swift语言入门很简单大学霸
Comments are closed.