Swift 遵守协议,并在采用该协议的另一个类初始值设定项中使用self作为参数

Swift 遵守协议,并在采用该协议的另一个类初始值设定项中使用self作为参数,swift,protocols,init,self,Swift,Protocols,Init,Self,我尝试实例化一个新类(MyService),该类将协议(MyProtocol)作为其“初始值设定项”中的参数。实例化MyService的类符合MyProtocol,因此我尝试使用self作为参数。但这不起作用,我在文件MyService.swift的下面一行中得到一个编译器错误: let service = MyService(delegate: self) MyService.swift: import Foundation protocol MyProtocol { func h

我尝试实例化一个新类(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() {
        ...
    }
}

如前所述,您不能在常量声明中使用self,因为此时您还没有self。初始化所有需要的变量并调用super.init之后,就有了一个self,而不是在此之前

实现此目标的最佳方法是将其更改为一个具有假定值的变量,该值将在初始化过程中设置,在初始化结束时实际:

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")
  }
}

但是如果我将MyProtocol更改为类实例,我会在MyClass中遇到另一个错误。swift:
使用未解析标识符self
对不起,我不理解你的问题,我将编辑答案以解决这个问题:注释太长如果你要将其更改为var,不妨将其定义为
lazy-var-service:MyService=MyService(delegate:self)
(依赖类型推断将触发编译器错误,抱怨
self
)闭包是不必要的,尽管我一直认为它是必要的。大概是幕后的“自动关闭”。还有一点需要注意:如果您总是在
init
中设置var,那么就不需要隐式地将其解包为可选变量(相反,这两个变量中的一个应该是
弱var
,它必须是某种形式的可选变量),那么您得到的编译器错误是什么?请包括任何有助于我们诊断和解决您的问题的内容。