属性
Swift中的属性分为存储属性(sorted variable)和计算型属性(computed variable)
存储型属性就是一般意义上理解的可以进行赋值和取值的变量。
var title = "学科"
计算型属性,字面意思为计算型的属性,这种属性没法存储值
计算型属性
特征:仅有get(readOnly语义)或有get+set的属性是计算型属性,有get+set的属性仅作为其他属性的外部接口
-
计算型属性本身不占用内存内控,所以不能赋值
get+set为计算型属性的原因:
真正赋值的过程是存在于set方法中并被底层包装掉的,如果我们手动实现了set方法,就无法进行正确的赋值
get+set正确的使用方法:作为其他属性的外部接口
private var _squre: Double = 0.0
var squre: Double {
get {
return _squre
}
set {
if (newValue <= 0) {
print("newValue = \(newValue)")
} else {
_squre = newValue
}
}
}
存储型属性
ps:初始化方法生成对象,并不会出发属性的willSet didSet方法若想再初始化阶段触发didSet,可以采用KVC的方式给对象初始化
willSet能获取将要赋给属性的值newValue
- 操作的属性是对旧值操作,会被之后的内部set覆盖掉
- 作用:观察
didSet能获取属性之前的旧值oldValue,新值即为属性 - 操作属性是对新值进行操作
- 作用:观察、数据加工
- 当使用了didSet就不能再使用set了,因为didSet中已经包含了set状态
class TestCard {
init(width: Double) {
self.width = width
}
var width: Double {
willSet {
print("willSet方法被调用")
print("在willSet中,width = \(width),newValue = \(newValue)")
}
didSet {
print("didSet方法被调用")
print("在didSet中,width = \(width),oldValue = \(oldValue)")
}
}
}
初始化方法生成对象,并不会触发属性的willSet didSet方法
// 初始化方法 不会触发 willSet didSet
let card = TestCard.init(width: 10.0)
改用KVC的方式给对象初始化,就可以调用didSet了:
- 修改:继承NSObject重新构造函数、属性前加@objc、属性变为必选类型并给默认值。 setValue(width, forKey: "width")
class TestCard: NSObject {
init(width: Double) {
super.init()
setValue(width, forKey: "width")
}
@objc var width: Double = 0.0 {
willSet {
print("willSet方法被调用")
print("在willSet中,width = \(width),newValue = \(newValue)")
}
didSet {
print("didSet方法被调用")
print("在didSet中,width = \(width),oldValue = \(oldValue)")
}
}
}
计算型属性与懒加载
计算型属性:只是为了调用其他属性而包装的读取方法
//计算型属性:只是为了调用其他属性而包装的读取方法
var title: String? {
get {
return "所选学课:" + "\(name)"
}
}
- 不分配独立的存储空间
- 每次调用时都会被执行
懒加载
- 在第一次调用时,执行闭包并且分配空间存储闭包返回的内容
- 会分配独立的存储空间
- 与OC不同的是lazy属性即使被设置为nil也不会被再次调用
lazy var title: String = {
return "所选学课:" + "(name)"
}()