Swift 遵守协议,并在采用该协议的另一个类初始值设定项中使用self作为参数
我尝试实例化一个新类(MyService),该类将协议(MyProtocol)作为其“初始值设定项”中的参数。实例化MyService的类符合MyProtocol,因此我尝试使用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
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
,它必须是某种形式的可选变量),那么您得到的编译器错误是什么?请包括任何有助于我们诊断和解决您的问题的内容。