You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Swift 中的属性分为存储属性与计算属性,存储属性即为我们平时常用的属性,可以直接赋值使用,而计算属性不直接存储值,而是根据其他(存储)属性计算得来的值。
在其他面向对象的编程语言中,例如 Java 和 Objective-C 中,get 和 set 方法提供了统一、规范的接口,可以使得外部访问或设置对象的私有属性,而不破坏封装性,也可以很好的控制权限(选择性实现 get 或 set 方法)。而 Swift 中似乎并没有见到类似的 get 和 set 方法,而 Swift 使用了一种名为属性观察器的概念来解决该问题。
extensionThenwhere Self:AnyObject{
/// Makes it available to set properties with closures just after initializing.
publicfunc then(_ block:(Self)->Void)->Self{block(self)returnself}}
属性观察器算是 Swift 中的一个 feature,变量在设值前会先进入 willSet,这时默认 newValue 等于即将要赋值的值,而变量本身尚未改变。变量在设值后会先进入 didSet,这时默认 oldValue 等于赋值前变量的值,而变量变为新值。
这样,开发者即可在 willSet 和 didSet 中进行相应的操作,如果只是取值和设值而不进行额外操作,那么直接使用点语法即可。但是有时候一个变量只需要被访问,而不能在外界赋值,那么可以使用访问控制修饰符加上 (set) 即可私有化 set 方法。例如 fileprivate(set),private(set),以及 internal(set)。值得注意的是,这里的访问控制修饰符修饰的是 set 方法,访问权限(即 get)是另外设置的。例如 public fileprivate(set) var prop = 0,该变量全局可以访问,但只有同文件内可以使用 set 方法。
前言
Swift 中的属性分为存储属性与计算属性,存储属性即为我们平时常用的属性,可以直接赋值使用,而计算属性不直接存储值,而是根据其他(存储)属性计算得来的值。
在其他面向对象的编程语言中,例如 Java 和 Objective-C 中,get 和 set 方法提供了统一、规范的接口,可以使得外部访问或设置对象的私有属性,而不破坏封装性,也可以很好的控制权限(选择性实现 get 或 set 方法)。而 Swift 中似乎并没有见到类似的 get 和 set 方法,而 Swift 使用了一种名为属性观察器的概念来解决该问题。
本文简单介绍下 Swift 中的这两种属性,以及属性观察器。
延迟存储属性
var
变量,因为其属性值在对象实例化前可能无法得到,而常量必须在初始化完成前拥有初始值。Demo
ViewController.swift
可以在延迟存储属性运算的代码中加入打印语句,即可验证其何时初始化。
Lazy 初始化的「演变」过程
Lazy 方法
devxoul/Then
Demo
ViewController.swift
Source Code
then()
then()
内部将self
返回,即可在初始化完成后,调用该方法,并在闭包中设置属性,而且不需要再将自身返回。with()
then()
适用于引用类型,而with()
适用于值类型。inout
确保方法内外共用一个值类型变量。do()
do()
使得可以直接在闭包中简单地执行一些操作。计算属性
Demo
综上,getter 可以根据存储属性推算计算属性的值,setter 可以在被赋值时根据新值倒推存储属性,但它们与我们在其他语言中的 get/set 方法却不一样。
属性观察器
willSet
,这时默认newValue
等于即将要赋值的值,而变量本身尚未改变。变量在设值后会先进入didSet
,这时默认oldValue
等于赋值前变量的值,而变量变为新值。willSet
和didSet
中进行相应的操作,如果只是取值和设值而不进行额外操作,那么直接使用点语法即可。但是有时候一个变量只需要被访问,而不能在外界赋值,那么可以使用访问控制修饰符加上(set)
即可私有化 set 方法。例如fileprivate(set)
,private(set)
,以及internal(set)
。值得注意的是,这里的访问控制修饰符修饰的是 set 方法,访问权限(即 get)是另外设置的。例如public fileprivate(set) var prop = 0
,该变量全局可以访问,但只有同文件内可以使用 set 方法。Demo
总结
Swift 的这几个 feature 我未曾在其他语言中见过,对于初学者确实容易造成凌乱。特别是 getter/setter 以及属性观察器中均没有代码提示,容易造成手误,代码似乎也变得臃肿。但是熟悉之后,这些也都能完成之前的功能,甚至更加细分。保持每一部分可控,也使得整个程序更加严谨,更加安全。
参考
The text was updated successfully, but these errors were encountered: