【问题标题】:How to use lazy initialization with getter/setter method?如何通过 getter/setter 方法使用延迟初始化?
【发布时间】:2017-08-29 12:27:00
【问题描述】:

我如何使用 getset() 闭包的延迟初始化。

这里是惰性初始化代码:

lazy var pi: Double = {
        // Calculations...
        return resultOfCalculation
        }()

这里是 getter/setter 代码:

var pi: Double {
    get {
        //code to execute
        return someValue
    }
    set(newValue) {
        //code to execute
    }
}

【问题讨论】:

  • 你为什么需要那个?有什么具体原因吗?
  • 1.那些不是闭包 2. getter 在被调用之前不会运行。你想完成什么?
  • 您如何看待这项工作?使用lazy 属性,它在第一次访问时设置。使用 setter 时,它会在使用 setter 时立即设置。你想要一个默认的惰性 getter 和一个显式的 setter 吗?请添加更多详细信息。
  • 你可能会检查: 属性观察者 超类属性的 willSet 和 didSet 观察者在子类初始化器中设置属性时调用,在调用超类初始化器之后。在类设置自己的属性时,在调用超类初始化程序之前,不会调用它们。

标签: ios swift getter-setter lazy-initialization


【解决方案1】:

我假设您正在尝试做的是懒惰地为可写属性生成默认值。我经常发现人们在不需要的时候会变得懒惰。确保这真的值得麻烦。只有在很少使用默认值但创建起来相当昂贵的情况下,这才值得。但如果这是你的情况,这是一种方法。

lazy 实现了一种非常具体且相当有限的模式,这通常不是您想要的。 (完全不清楚lazy 是否是该语言的一个有价值的补充,因为它是如何工作的,并且正在积极地用更强大和有用的属性系统来替换它。)当lazy 不是您想要的工具,您只需构建您自己的工具。在您的示例中,它看起来像这样:

private var _pi: Double?
var pi: Double {
    get {
        if let pi = _pi { return pi }
        let result = // calculations....
        _pi = result
        return result
    }

    set { _pi = newValue }
}

也就是说,在我看到的大多数情况下,最好在 init 中使用默认值:

func computePi() -> Double {
    // compute and return value
}

// This is global. Globals are lazy (in a thread-safe way) automatically.
let computedPi = computePi()

struct X {
    let pi: Double // I'm assuming it was var only because it might be overridden
    init(pi: Double = computedPi) {
        self.pi = pi
    }
}

这样做只会在整个程序中计算一次 pi(而不是每个实例一次)。它让我们可以使pi“只写一次”而不是可变状态。 (这可能符合您的需求,也可能不符合;如果确实需要可写,那么var。)

类似的默认值方法可用于构建成本高昂的对象(而不是计算成本高昂的静态事物),而无需全局。

struct X {
    let pi: Double
    init(pi: ExpensiveObject = ExpensiveObject()) {
        self.pi = pi
    }
}

但有时 getter 和 setter 更合适。

【讨论】:

    【解决方案2】:

    lazy 变量的意义在于它在被获取之前不会被初始化,从而阻止它的(可能是昂贵的)初始化程序运行直到并且除非变量的值被访问。

    嗯,这正是计算变量的 getter 所做的!它不会运行,除非它被调用。因此,计算变量的 getter 惰性的。

    因此,总的来说,这个问题毫无意义。 (短语“我如何使用惰性初始化”揭示了这个缺陷,因为计算变量从不初始化——它是计算出来的!)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-10
      • 2010-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-17
      相关资源
      最近更新 更多