属性
存储属性
存储属性就是一个存储常量let
或者变量var
的属性
存储属性有一个专属技能lazy(延时加载或懒加载)
lazy
必须与var
和=
同时出现
lazy
表达式 =
右边必须是一个常量(闭包的简化)
或者一个执行闭包
存储属性的标志let
,=
,lazy var
,属性表达式存在任何一个标志都是存储属性
class Person
{
//存储属性
let name:String = "小史"
lazy var age:Int = 0
var firstName:String?
lazy var secondName:String = {
return "hello" + "world"
}()
}
计算属性
计算型属性通常依赖于其他属性
计算属性不直接存储变量值,而是通过getter
和setter
方法来操作变量值
,getter取值
,setter赋值
为了防止死循环计算属性的getter
和setter
方法实现需要一个中间变量属性
来完成
计算属性的getter方法是必须实现的
,setter方法可以选择实现
计算属性如果只实现了getter方法,就是只读属性
计算属性操作的是变量值
,只能用var
class Person{
private var _name:String?//中间变量属性
var name:String?{
get{
return _name
}
set{
_name = newValue
}
}
//只读属性实现,只读属性可以省略get关键字及一对{}
var realName:String{
print(_name)
return _name
}
}
类型属性
类型属性也区分计算属性和存储属性
static
修饰的既可以是计算属性
也可以是存储属性
class
修饰的属性只能是计算属性
需要在子类当中重写的类型属性,必须使用class
修饰,这里的重写包括添加属性观察器
永远不要用用lazy
修饰一个类型属性(lazy是存储属性的专属但是默认存储类型属性本身就是lazy的)
出过以上三条其余参照上面实例属性
class Person{
static var firstName = "小史"
private static var _secondName = "😄"
class var secondName:String{
get{
return _secondName
}
set{
_secondName = newValue
}
}
}
属性观察器
属性观察器最常用的方式就是在属性观察器方法中更新UI,当然像OC一样在setter方法中更新UI也是不错的选择,个人感觉因为实现setter就必须实现getter,然而我们只需要的是setter,getter并没有什么卵用,所以还不如直接写在观察器方法中更新UI
属性的初始化不会触发属性观察器
给当前类添加属性观察器
只能给lazy
之外的存储属性添加属性观察器
var storedProperty:String?{
//willSet默认携带newValue参数,当然参数名称可以自行定义
willSet
{
//更新UI
print(newValue)
}
//didSet默认携带oldValue参数,当然参数名称可以自行定义
didSet
{
//更新UI
print(oldValue)
}
}
给继承属性添加属性观察器
子类可以给任何继承而来的非let
属性添加属性观察器,包括全局属性
只能通过override
重写属性给继承属性添加属性观察器
重写属性必须明确属性的类型,方便编译器定位哪个属性需要重写
override var storedProperty:String?{
//willSet默认携带newValue参数,当然参数名称可以自行定义
willSet
{
//更新UI,这里的newValue是将要赋给storedProperty的值,每次拿到的都是新值
print(newValue)
}
//didSet默认携带oldValue参数,当然参数名称可以自行定义
didSet
{
//更新UI这里的oldValue是storedProperty赋新值前的值,第一次拿到的就是nil,可选类型为赋新值就是nil
print(oldValue)
}
}
重写
重写关键字override
,子类可以
重写父类的函数或者属性,这里着重讨论重写属性,这里的重写包括给继承属性添加(或者重写)属性观察器和重写属性的setter和getter方法
子类可以给任何继承而来的非let
属性重写(添加)属性观察器和getter,setter方法,包括计算属性和存储属性
在写setter和getter的时候,可以将一个集成来的只读属性,重写写成一个读写属性,但是不能将一个读写属性重写成一个只读属性,就像不能将一个float值赋给一个double型,但是不能把一个double型赋值给一个float型一样,会截断
private var _storedProperty:String? = "属性"
override var storedProperty:String?{
get
{
return _storedProperty
}
set
{
_storedProperty = oldValue
}
}
在方法或属性定义关键字前面添加final关键字表明该属性或者方法不能被重写
在类定义前添加final关键字表明该类不能被继承
全局变量
默认的swift中的全局变量都是延时加载的与实例属性的懒加载属性是相似的(但是并没有显式的lazy关键字)
网友评论