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