1、属性访问控制
2、属性观察
3、KVO
4、lazy修饰符和lazy方法
1、属性访问控制
- 对于方法来说比较直接,我们想让同一module(或者说是target)中的其他代码访问的话,保持默认的internal就可以了。如果我们在为其他开发者开发库的话,可能会希望用一些public,因为在target外只能调用public的代码。而那些只希望在本文件内访问的方法,我们应该用private加以限制,以防止暴露给项目的其他部分。
- 对于属性:
class MyClass {
//只希望在当前文件中使用的属性
private var name: String?
//因为set被限制为private,所以我们就可以保证name只能在当前文件进行修改。
private(set) var name: String?
//name只能在当前文件就行修改,可以在别的module中访问这个属性。
public private(set) var name: String?
}
2、属性观察
- 在Swift中所有声明的属性包括存储属性和计算属性两种。其中存储属性将会在内存中实际分配地址对属性进行存储,而计算属性则不包括背后的存储,只是提供set和get两种方法。
- 在willSet和didSet中我们分别可以使用newValue和oldValue来获取将要设定的和已经设定的值。
- 初始化方法对属性的设定,以及在willSet和didSet中对属性的再次设定都不会再次触发属性观察的调用,一般来说这会是你所需要的行为,可以放心使用。
- 在同一个类型中,属性观察和计算属性是不能同时共存的。也就是说,想在一个属性定义中同时出现set和willSet或didSet是一件办不到的事情。
- 如果我们无法改动这个类,又想要通过属性观察做一些事情的话,可能就需要子类化这个类,并且重写他的属性了。重写的属性并不知道父类属性的具体实现情况,而只从父类属性中继承名字和类型,因此在子类的重载属性中我们是可以对父类的属性任意的添加属性观察的,而不用在意父类中到底是存储属性还是计算属性。
3、KVO
- KVO我们可以实现很多松耦合的结构,使代码更加灵活和强大:像通过监听model的值来自动更新UI的绑定这样的工作,基本都是基于KVO来完成的。
- 在Swift中我们也是可以使用KVO的,但是仅限于在NSObject的子类中。这是可以理解的,因为KVO是基于KVC以及动态派发技术实现的,而这些东西都是Objective-C运行时的概念。
- 另外由于Swift为了效率,默认禁用了动态派发,因此想用Swift来实现KVO,我们还需要做额外的工作,那就是将想要观测的对象的属性标记为dynamic。
- 被观察对象和观察者都必须是NSObject的子类
4、lazy修饰符和lazy方法
- 我们在使用lazy作为属性修饰符时,只能声明属性是变量。另外我们需要显式的指定属性类型,并使用一个可以对这个属性进行赋值的语句来在首次访问属性时运行。
class ClassA {
lazy var str: String = {
let str = “Hello”
print(“只在首次访问输出”)
return str
}() //匿名的闭包
}
- 为了简化,我们如果不需要做什么额外工作的话,也可以对这个lazy的属性直接写赋值语句。
lazy var str: String = “Hello”
- 对于那些不需要完全运行,可能提前退出的情况,使用lazy来进行性能优化效果会非常有效。
网友评论