遵守协议并在另一个采用该协议的 class 初始化器中使用 self 作为参数

Conform to a protocol and use self as argument in another class initializer that takes that protocol

我尝试实例化一个新的 class (MyService),它在其初始化程序中将协议 (MyProtocol) 作为参数。实例化 MyService 的 class 符合 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() {
        ...
    }
}

如评论所述,您不能在常量声明中使用 self,因为此时您还没有 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")
  }
}

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

class MyClass : MyProtocol {

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

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