关联类型不符合协议

问题描述 投票:0回答:1

我正在尝试创建一个通用的注册系统。我创建了如下结构。

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
协议不起作用。

我哪里做错了?我该如何解决这个问题?

ios swift generics swift-protocols
1个回答
0
投票

使

LBRegisterPhotoStepView
泛型并将相应的关联类型引入
LBRegisterPhotoStepViewDelegate
可以使这种关系有效:

protocol LBRegisterPhotoStepViewDelegate: LBRegisterDelegate {

  associatedtype Delegate: LBRegisterPhotoStepViewDelegate

  func choosePhotoRequestReceived(from: LBRegisterPhotoStepView<Delegate>)  

}

class LBRegisterPhotoStepView<Delegate: LBRegisterPhotoStepViewDelegate>: LBRegisterable {

  var delegate: Delegate?

  func doRegister() { }  

}
© www.soinside.com 2019 - 2024. All rights reserved.