遵守协议并在另一个采用该协议的 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")
}
}
我尝试实例化一个新的 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")
}
}