swift面向对象之属性
存储属性
可以存储常量和变量
惰性存储属性
语法:lazy var 变量
惰性存储属性只有在用的时候才会完成真正的初始化,刚开始的初始化代码只是类型占位,并没有分配存储空间。
比如
class people{
var name:String
init(name:String){
self.name=name
}
}
class car{
lazy var carOwner=people(name:”shu”)
fun show(){
println(carOwner.name)
}
}
然后新建一个car实例,这时carOwner并没有初始化,只有当car实例调用show方法时,才会给carOwner这个属性分配存储空间。
以下3种情况用到惰性存储属性
1.在构造属性的时候无法知道属性的外部信息,则使用惰性属性(比如当你输入框输入时你才知道该把属性赋值什么)
2.当属性的值需要大量计算或者很复杂时,为了不阻塞对象初始化
3.必须把惰性存储属性设置成变量,因为属性的值在实例完成构造前,无法得到
计算属性
计算属性有下面几个特点
虽然是属性,却没有实际的内存空间,在类的结构中不占存储位置
提供了取值访问器get和赋值访问器set,负责获取该属性的值,或提供该属性给其他的存储属性赋值
为swift类属性增加了开闭规则
但凡计算属性必须是变量类型var,因为计算属性不确定
取值访问器的标准格式
var 计算属性:类型{
get{
return 值
}
}
精简形式
var 计算属性:类型{
return 值
}
对于赋值访问器
var 计算属性:类型{
set(newValue){
进行属性赋值
}
}
精简形式
var 计算属性:类型{
set{}
}
只读控制,即开闭规则的实现,对于某些属性我们只允许访问而不允许赋值,则称这类属性为只读属性。对外访问开发,对内赋值关闭,这是编程原则里面很重要的开闭规则
var isHappy:Bool{
//取值访问器
get{
if(dream!=“”&&(dream == realty)||lover!=nil||apperance=“帅到睡不着”)
return true
}else{
return false
}
}
类型属性
类型属性的格式为class var 属性名:类型{get/set{}}
对于引用类型(类就属于引用类型)必须使用计算属性而不能使用存储属性
必须给类型属性指定默认值,因为类型属性不属于实例范畴,不能使用任何一个实例是构造器赋值
类型属性本质是计算属性的范畴,与get/set访问器的用法完全相同
下面一个例子
class People{
class var planet:String{
return “地球”
}
}
属性观察器
属性观察器不能用在惰性存储属性上,因为惰性存储属性是临时产生的,所以无法观察其有效期。
对于可以重写的属性,可以在子类中增加观察器,但是对于非重写的属性则没有必要,因为可以在赋值访问器中触发观察的行为
类似于kvo模式
属性观察器可以用于全局变量和局部变量
willSet
willSet(willSetValue){
//willSetValue可以用户自定义
}简化格式为:willSet{
//必须使用newValue作为参数
}
didSet
didSet(oldSetValue){
//oldSetValue可以用户自定义
}简化格式为:didSet{
//必须使用oldValue作为参数
//}