一尘不染

用依赖于其他实例变量的值初始化惰性实例变量

swift

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

无法在属性初始化程序中使用实例成员’getEventCalendar’;属性初始化程序在“自我”可用之前运行。

是否有初始化任何适当的方式lazy与依赖于其他对象类型的值实例变量instance variablesself(不只是self单纯?我已经尝试过将getEventCalendar方法从一种方法转换为一种功能,但这也无济于事。

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? {
    // ...
  }
}

阅读 207

收藏
2020-07-07

共1个答案

一尘不染

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

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

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

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
2020-07-07