例如,我想SendMessageUseCase用作變數型別,var sendMessageUseCase: SendMessageUseCase但我不能。
我不斷收到錯誤Protocol 'SendMessageUseCase' can only be used as a generic constraint because it has Self or associated type requirements
這顯然我理解錯誤,但它沒有意義。
在SendMessageUseCase我已經定義了我的關聯型別 usingWhere子句,這意味著從技術上講編譯器應該能夠推斷,因為我已經分別明確定義了Input和Outputto beSendMessageUseCaseInput和SendMessageUseCaseOutput。
protocol UseCaseInput {}
protocol UseCaseOutput {}
protocol UseCase : AnyObject {
associatedtype Input: UseCaseInput
associatedtype Output: UseCaseOutput
func execute(input: Input, _ completion: (_ output: Output) -> ())
}
struct SendMessageUseCaseInput : UseCaseInput {
var text: String
}
struct SendMessageUseCaseOutput: UseCaseOutput {
var response: String
}
protocol SendMessageUseCase: UseCase where Input == SendMessageUseCaseInput, Output == SendMessageUseCaseOutput {
}
final class TestSendMessageUseCase : SendMessageUseCase {
func execute(input: SendMessageUseCaseInput, _ completion: () -> ()) {
}
}
// Why this doesn't work?
var sendMessageUseCase: SendMessageUseCase = TestSendMessageUseCase()
可以SendMessageUseCase.Input是什么以外的東西SendMessageUseCaseInput?我不這么認為,這就是為什么我認為應該推斷出來的原因。但顯然我錯了,不明白為什么。
uj5u.com熱心網友回復:
感謝@Jessy 的評論,我能夠找到一個臨時解決方案。
添加some到sendMessageUseCase變數將允許我們使用opaque型別,但仍然存在限制,因為您不能擁有陣列。
有一些談判來實施這一點,但截至目前(2022 年 5 月 28 日)仍未實施。
protocol UseCaseInput {}
protocol UseCaseOutput {}
protocol UseCase : AnyObject {
associatedtype Input: UseCaseInput
associatedtype Output: UseCaseOutput
func execute(input: Input, _ completion: (_ output: Output) -> ())
}
struct SendMessageUseCaseInput : UseCaseInput {
var text: String
}
struct SendMessageUseCaseOutput: UseCaseOutput {
var response: String
}
protocol SendMessageUseCase: UseCase where Input == SendMessageUseCaseInput, Output == SendMessageUseCaseOutput {
}
final class TestSendMessageUseCase : SendMessageUseCase {
func execute(input: SendMessageUseCaseInput, _ completion: (SendMessageUseCaseOutput) -> ()) {
}
}
var sendMessageUseCase: some SendMessageUseCase = TestSendMessageUseCase()
如果有人對此感興趣,請查看論壇主題
解除對existentials的“自我或關聯型別”約束
[[Sema] AST][WIP] 用具體的 assoc 支持存在主義。型別 #21576(公關已關閉)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/483537.html
下一篇:泛型Java-獲取泛型的泛型型別
