使用初始值设定项的延迟属性

时间:2014-06-06 00:53:43

标签: ios properties lazy-loading swift

我正在尝试使用@lazy属性按需加载属性,但我需要将成员变量传递给延迟加载的实例的初始化程序。

以下是

的例子
class Worker
{
  init(AnyObject context) { ... }
}

class Hive
{
  let context : AnyObject

  init(AnyObject context)
  {
    self.context = context
  }

  @lazy var worker = Worker(self.context)   // This does not work
}

是否无法将成员变量注入延迟加载的属性?

这是我讨厌的解决方法:

class Hive
{
  // initializer and context constant elided

  let lazy = Lazy()

  class Lazy
  {
    var worker : Worker? = nil
    var token : dispatch_once_t = 0
  }

  var worker : Worker
  {
    get
    {
      dispatch_once(&lazy.token) { self.lazy.worker = Worker(self.context) }
      return lazy.worker!
    }
  }
}

请告诉我有更好的方法来实现这一目标......

1 个答案:

答案 0 :(得分:3)

以下代码为我编译(您的代码必须在XCode之外输入,因为语法已关闭)

class Worker
{
    init(context : AnyObject) {  }
}

class Hive
{
    var context : AnyObject

    init(context : AnyObject)
    {
        self.context = context
    }

    @lazy var worker : Worker = {
        let instance = Worker(context: self.context)
        return instance;
    }()
} 

它也可以在没有封闭的情况下工作:

    @lazy var worker : Worker = Worker(context: self.context)