![](/img/trans.png)
[英]how to use Void type in a closure of protocol with associatedtype in Swift
[英]Use Protocol with associatedtype as a Type
我有這樣的協議
protocol ViewBuilder {
associatedtype In
associatedtype Out
func build(_ data: In?) -> Out?
}
我有這樣的具體結構。 TitleTypeView和ButtonTypeView具有相同的超級 class。
struct HeaderTitleBuilder: ViewBuilder {
func build(_ data: DataSource?) -> ViewFactory? {
guard let data = data else { return nil }
return TitleTypeView(data)
}
}
struct HeaderButtonBuilder: ViewBuilder {
func build(_ data: DataSource?) -> ViewFactory? {
guard let data = data else { return nil }
return ButtonTypeView(data)
}
}
我必須將 Builders 結構組合到 HeaderBuilder
struct TestStruct {
func create() {
HeaderBuilder(titleBuilder: HeaderTitleBuilder()
, seeallBuilder: HeaderButtonBuilder())
}
}
struct HeaderBuilder
{
private(set) var titleBuilder: some ViewBuilder = HeaderTitleBuilder()
private(set) var buttonBuilder: some ViewBuilder = HeaderButtonBuilder()
}
我收到了這個錯誤
無法將“HeaderTitleBuilder”類型的值轉換為預期的參數類型“某些 ViewBuilder”
無法將“HeaderButtonBuilder”類型的值轉換為預期的參數類型“某些 ViewBuilder”
所以我嘗試使用協議作為通用約束
struct HeaderBuilder <T: ViewBuilder>
where T.In == DataSource, T.Out == ViewFactory {
private(set) var titleBuilder: T = HeaderTitleBuilder()
private(set) var buttonBuilder: T = HeaderButtonBuilder()
}
DataSource和ViewFactory都是沒有關聯類型的協議。
我得到了這個錯誤。
將 arguments 與通用參數“T”沖突(“HeaderTitleBuilder”與“HeaderButtonBuilder”)
我猜編譯器正在使用 HeaderTitleBuilder 和 HeaderButtonBuilder 來推斷 T 的類型。但這不是我想要的。 我只需要 T 成為允許我傳遞任何 Builder 類型的協議類型。
由於ViewBuilder
是一個協議,因此當您嘗試將T
設為具體類型時,無論該類型T
是HeaderTitleBuilder
還是HeaderButtonBuilder
都會產生沖突。 T
不能同時是兩者。
您可以改為使兩者都有一個單獨的通用參數,例如:
struct HeaderBuilder<TitleBuilder: ViewBuilder, ButtonBuilder: ViewBuilder> where TitleBuilder.In == DataSource, TitleBuilder.Out == ViewFactory, ButtonBuilder.In == DataSource, ButtonBuilder.Out == ViewFactory {
private(set) var titleBuilder: TitleBuilder
private(set) var buttonBuilder: ButtonBuilder
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.