符合协议并在另一个采用该协议的类初始化程序中使用self作为参数

时间:2015-09-02 08:08:01

标签: swift protocols init self

我尝试实例化一个新类(MyService),它将协议(MyProtocol)作为其初始化程序中的参数。实例化MyService的类符合MyProtocol,因此我尝试使用self作为参数。但这不起作用,我在以下行的文件MyService.swift中得到编译器错误:

let service = MyService(delegate: self)

MyService.swift:

import Foundation

protocol MyProtocol {
    func handle()
}

class MyService {
    let delegate: MyProtocol

    init(delegate: MyProtocol) {
        self.delegate = delegate
    }
}

MyClass.swift:

import Foundation

class MyClass : MyProtocol {
    let service = MyService(delegate: self)

    func handle() {
        ...
    }
}

1 个答案:

答案 0 :(得分:0)

如评论所述,您不能在常规声明中使用self,因为此时您还没有自我。一旦初始化了所有需要的变量并且调用了super.init,就会产生自我,而不是在此之前。

实现它的最佳方法是将其更改为具有假定值的变量,该假定值将在初始化期间设置,实际结束时:

protocol MyProtocol : class {
  func handle()
}

class MyService {

  var delegate: MyProtocol

  init(delegate: MyProtocol) {
    self.delegate = delegate
  }
}

class MyClass : MyProtocol {

  var service:MyService!

  init() {
    service = MyService(delegate: self)
  }

  func handle() {
    NSLog("handle")
  }
}

如Christopher Swasey所建议的那样,您也可以使变量变为惰性变量,而不是使用init方法:

class MyClass : MyProtocol {

  lazy var service:MyService = MyService(delegate: self)

  func handle() {
    NSLog("handle")
  }
}