swift 协议之间的关联类型约束出现问题

von4xj4u  于 2022-12-02  发布在  Swift
关注(0)|答案(1)|浏览(170)

我有一个协议:

protocol CellContentViewButtonTappable: CellContentView {
    associatedtype ButtonData
    var delegate: (any CellContentViewButtonTappableDelegate)? { get }
}

和代表:

protocol CellContentViewButtonTappableDelegate: AnyObject {
    associatedtype ButtonData
    func buttonTapped(_ data: ButtonData)
}

这里的要点是,当我从一个符合CellContentViewButtonTappable的类中调用delegate?.buttonTapped(_:)时,我希望我传递回来的ButtonData与符合CellContentViewButtonTappableDelegate的类中的ButtonData相同。但我不太确定如何做到这一点。我尝试过以下方法:

protocol CellContentViewButtonTappable: CellContentView {
    associatedtype ButtonData where ButtonData == CellContentViewButtonTappableDelegate.ButtonData
    var delegate: (any CellContentViewButtonTappableDelegate)? { get }
}

但是沿着这条路线走下去总是会导致错误:

Associated type 'ButtonData' can only be used with a concrete type or generic parameter base

我觉得我已经接近this change added in Swift 4了,应该允许我做这样的事情,但是我就是没有做对。如果有人能给我指出正确的方向,我会很感激的。

nwnhqdif

nwnhqdif1#

我认为您需要Swift 5.7中的primary associated types特性,而不是Swift 4中的关联类型约束。
ButtonData做为委派的主要相关型别,宣告委派如下:

protocol CellContentViewButtonTappableDelegate<ButtonData>: AnyObject {
    associatedtype ButtonData
    func buttonTapped(_ data: ButtonData)
}

CellContentViewButtonTappable中,可以执行以下操作:

var delegate: (any CellContentViewButtonTappableDelegate<ButtonData>)? { get }

相关问题