ios – 通过将属性设置为nil,在Swift中再次触发延迟初始化器

前端之家收集整理的这篇文章主要介绍了ios – 通过将属性设置为nil,在Swift中再次触发延迟初始化器前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我想要一个懒惰初始化的属性,其初始化程序我可以再次调用,如果我将属性设置为nil.

如果我这样定义我的属性

  1. lazy var object = { /*init code*/ }()

…以后调用属性,初始化程序被触发一次.但是,如果我在程序中稍后将对象设置为nil,则不会再次调用初始化程序.如何在Swift中做到这一点?

我研究了计算属性,但实际上并不存储值,所以每当调用变量时,总是会出现计算或初始化.只有当属性为nil时才想计算.

解决方法

lazy属性初始化器负责在读取模式下首次访问该属性时初始化该属性.设置为nil对初始化状态没有影响 – 它只是属性存储的有效值.

您可以模仿一个具有3个属性的延迟初始化:

>一个私有的初始化程序,实现为一个计算属性(或一个闭包,如果你愿意)
> private backing属性,存储实际值
>一个非私有属性,这是您在代码中实际使用的属性

代码如下所示:

  1. class MyClass {
  2. private var _myPropInitializer: Int {
  3. return 5
  4. }
  5.  
  6. private var _myProp: Int?
  7.  
  8. var myProp: Int? {
  9. get {
  10. if self._myProp == nil {
  11. self._myProp = self._myPropInitializer
  12. }
  13. return _myProp!
  14. }
  15. set {
  16. _myProp = newValue
  17. }
  18. }
  19. }

> initializer属性在需要初始化时返回变量的计算值,这是上面例子中的5整数
> myProp是一个可选的整数(能够存储一个零):

> on set,它会将新值存储在_myProp属性
> on get,如果_myProp为零,它调用初始化程序,将其分配给_myProp,并返回其值

如果要重用该模式,最好将所有内容放在一个类中:

  1. class Lazy<T> {
  2. private let _initializer: () -> T
  3. private var _value: T?
  4. var value: T? {
  5. get {
  6. if self._value == nil {
  7. self._value = self._initializer()
  8. }
  9. return self._value
  10. }
  11. set {
  12. self._value = newValue
  13. }
  14. }
  15.  
  16. required init(initializer: () -> T) {
  17. self._initializer = initializer
  18. }
  19. }

注意:结构体不可用,因为不允许在属性getter内设置属性,而在类中.

那么你可以使用它如下:

  1. class MyTestClass {
  2. var lazyProp: Lazy<Int>
  3.  
  4. init() {
  5. self.lazyProp = Lazy( { return 5 } )
  6. }
  7. }

操场上的一些测试:

  1. var x = MyTestClass()
  2. x.lazyProp.value // Prints {Some 5}
  3. x.lazyProp.value = nil
  4. x.lazyProp._value // Prints nil
  5. x.lazyProp.value // Prints {Some 5}

缺点是您必须以x.lazyProp.value的形式访问实际的属性,而不能以x.lazyProp的形式访问.

猜你在找的iOS相关文章