用依赖于其他实例变量的值初始化惰性实例变量 [英] Initialize lazy instance variable with value that depends on other instance variables

查看:84
本文介绍了用依赖于其他实例变量的值初始化惰性实例变量的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

以下初始化当前在调用getEventCalendar的行中产生此错误:

The following initialization currently produces this error in the line that calls getEventCalendar:

无法在属性内使用实例成员'getEventCalendar' 初始值设定项;属性初始值设定项在自我"可用之前运行.

Cannot use instance member 'getEventCalendar' within property initializer; property initializers run before 'self' is available.

是否有任何合适的方法来初始化lazy实例变量,其值取决于self的其他对象类型instance variables(不仅仅是self

Is there any suitable way for initializing the lazy instance variable with a value that depends on other object-type instance variables of self (not just self alone) ? I've e.g. tried turning getEventCalendar from a method into a function, but this does not help either.

class AbstractEventCalendarClient {

  let eventStore: EKEventStore
  let entityType: EKEntityType

  lazy var eventCalendar = getEventCalendar()

  init(eventStore: EKEventStore, entityType: EKEntityType) {
    self.eventStore = eventStore
    self.entityType = entityType
  }

  func getEventCalendar() -> EKCalendar? {
    // ...
  }
}

推荐答案

您可以使用仅执行一次的闭包来捕获self的属性,并在执行时使用它们(=首次使用lazy属性).例如

You can use a once-only executed closure which captures properties of self and use these at execution (= first use of the lazy property). E.g.

class Foo {
    var foo: Int
    var bar: Int
    lazy var lazyFoobarSum: Int = { return self.foo + self.bar }()

    init(foo: Int, bar: Int) { 
        self.foo = foo 
        self.bar = bar
    }
}

let foo = Foo(foo: 2, bar: 3)
foo.foo = 7
print(foo.lazyFoobarSum) // 10

W.r.t.自行尝试:您可以以同样的方式在此仅执行一次的闭包中使用self的帮助(实例)功能.

W.r.t. to your own attempt: you may, in the same way, make use of help (instance) functions of self in this once-only executed closure.

class Foo {
    var foo: Int
    var bar: Int
    lazy var lazyFoobarSum: Int = { return self.getFooBarSum() }()

    init(foo: Int, bar: Int) { 
        self.foo = foo 
        self.bar = bar
    }

    func getFooBarSum() -> Int { return foo + bar }
}

let foo = Foo(foo: 2, bar: 3)
foo.foo = 7
print(foo.lazyFoobarSum) // 10

这篇关于用依赖于其他实例变量的值初始化惰性实例变量的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆