我正在尝试创建一个通用的注册系统。我创建了如下结构。
public protocol LBRegisterable: AnyObject {
associatedtype CustomRegisterDelegate: LBRegisterDelegate
var delegate: CustomRegisterDelegate? {get set}
func doRegister()
}
所有的注册步骤都必须继承这个协议。
doRegister()
方法用于完成当前注册步骤
创建
CustomRegisterDelegate
是为了与视图控制器进行通信。当当前注册步骤完成时,每个注册类通过这个委托通知视图控制器结果。由于此结果声明方法将在每个委托类中,因此它是在名为 LBRegisterDelegate
. 的协议中创建的
public protocol LBRegisterDelegate: AnyObject {
func registerResult(from: LBRegisterStepType, result: LBRegisterResult)
}
我的问题是这个构建会抛出一个错误。我希望您在查看下面的示例时会更好地了解情况。
照片选择步骤类:
public protocol LBRegisterPhotoStepViewDelegate: AnyObject, LBRegisterDelegate {
func choosePhotoRequestReceived(from: LBRegisterPhotoStepView)
}
用户必须选择图像。单击按钮时,此委托会通知视图控制器。
public class LBRegisterPhotoStepView: LBView, LBRegisterable {
public typealias CustomRegisterDelegate = LBRegisterPhotoStepViewDelegate
public var delegate: LBRegisterPhotoStepViewDelegate?
public func doRegister() { }
}
CustomRegisterDelegate
是关联类型,必须继承自 LBregisterDelegate
协议。我在本节中给出的 LBregisterPhotoStepViewDelegate
协议不起作用。
我哪里做错了?我该如何解决这个问题?
使
LBRegisterPhotoStepView
泛型并将相应的关联类型引入LBRegisterPhotoStepViewDelegate
可以使这种关系有效:
protocol LBRegisterPhotoStepViewDelegate: LBRegisterDelegate {
associatedtype Delegate: LBRegisterPhotoStepViewDelegate
func choosePhotoRequestReceived(from: LBRegisterPhotoStepView<Delegate>)
}
class LBRegisterPhotoStepView<Delegate: LBRegisterPhotoStepViewDelegate>: LBRegisterable {
var delegate: Delegate?
func doRegister() { }
}