计算属性相当于Object-C的getter、setter合成的属性,在Swift中结构体、类都可以定义计算属性
定义计算属性
[修饰符] var 计算属性名:属性类型{
get{
//getter方法执行体,该方法必须有返回值
}
[set(形参名)
{
//setter方法执行体,该方法一定不能有返回值
}]
}
注意:var计算属性只能定义成变量形式
enum Season
{
case Spring,Summer,Fall,Winter
var info:String
{
get{
print("正在执行getter方法")
switch(self)
{
case .Spring:
return "春暖花开"
}
default:
return "此恨绵绵无绝期"
}
}
set(newValue)
{
print("正在执行setter方法,传入参数为:\(newValue)")
}
}
}
var s=Season.Spring
print(s.info)//访问info属性,实际就是调用对应的getter方法
s.info="秋高气爽"//对info属性赋值,实际就是调用对应的setter方法
}
再举一个类的例子
class User
{
var first:String=""
var last:String=""
var fullName:String
{
get {
return first + "-" + last
}
set(newValue)
{
var names=newValue.componentsSeparatedByString("-")
self.first=names[0]
self.last=name[1]
}
}
init(first:String,last:String)
{
self.first=first
self.last=last
}
}
let s=User(first:"六小龄童",last:"孙悟空")
print(s.fullName)
s.fullName="甄子丹-悟空"
print(s.first)//输出甄子丹
print(s.last)//输出悟空
setter方法简化
计算属性的setter方法总是只有一个形参,且该形参的类型与该计算属性的类型相同,因此Swift允许在定义计算属性时省略set部分的形参名。
如果程序省略计算属性的set部分的形参名,程序将为该形参提供一个隐式的形参名:newValue。所以可以改为
set{
var names=newValue.componentsSeparatedByString("-")
self.first=name[0]
self.last=name[1]
}
只读的计算属性
只有get部分的话称为只读的计算属性。我们可以省略get关键字和花括号
如上面的可以改为
var fullName:String{
return first + "-" + last
}
注意即使是只读属性也必须用var关键字