在类中,我们可以在其属性或者方法前面加class进行修饰,调用的时候,直接Square.PI 就可以了。 代码中是对“计算属性”进行了class修饰。而这里的计算属性只是简写,我们也可以写成下面的方式:
class Square {
// 类型属性,用class关键字
class var PI: Double{
return 3.14
}
}
类属性(或者叫做类型属性)用class关键字修饰.类属性只能是计算属性.
class Person7{
class var name:String{
return "xuneng"
}
}
Person7.name
但需要注意的是,存储属性不能使用class进行修饰。
class Student {
class var phone: String?
}
编译后会报错:“class variables not yet supported”
而用static就可以了。
class Student {
static var phone: String?
}
计算性属性
//默认参数newValue, 表示新赋给的值
class Person5{
//用newValue
var jjLength:Int = 10
var age:Int{ //只能是var
get{
return jjLength * 2
}
set{
jjLength = newValue / 2
}
}
//只读计算属性
var height:Int{
get{
return jjLength * 4
}
}
var height2:Int{ //只读直接可以省略get
return jjLength * 4
}
}
var p5 = Person5()
p5.height
//p5.height = 10 //只读的不能赋值
计算属性的值是不固定的,因此不能用let修饰,只能用var
计算属性不能直接赋值
class Person6{
//用newValue
var jjLength:Int = 10
// var height2:Int = 10{ //不能直接赋值, 否则成存储属性了
// return jjLength * 4
// }
var age:Int{
get{
return age //死循环. age会调用get方法
}
set{
age = newValue //死循环. age设值时会调用set方法
}
}
}
属性监视器: 可用来监视属性变化的2个方法willSet, didSet
计算属性因为有get和set方法,因此监视器其实对计算属性没多大用处.对存储属性用处大
初始化值时, 不会调用willSet与didSet
willSet, didSet和set, get不能共存
[java] view plain copy 在CODE上查看代码片派生到我的代码片
willSet 在新的值被设置之前调用
didSet 在新的值被设置之后立即调用
class Person8{
var name:String = "xuneng"{
willSet{
println("新值为:\(newValue)") //newValue新值
}
didSet{
println("新值为:\(oldValue)") //oldValue表示旧值
}
}
}
var p8 = Person8()
p8.name = "jack" //这句调用
print("\(p8.name)")
计算型变量和计算型属性
var 变量名称: 类型 {
get {
语句
}
set(setter 名称) {
语句
}
}
存储型变量和属性的观察器
可以在声明存储型变量或属性时提供 willSet 和 didSet 观察器。一个包含观察器的存储型变量或属性以如下形式声明:
var 变量名称: 类型 = 表达式 {
willSet(setter 名称) {
语句
}
didSet(setter 名称) {
语句
}
}