[英]swift protocol associatedtype
我有一個關於 swift 協議關聯類型的問題。
protocol SomeProtocol {}
protocol TestAProtocol: SomeProtocol {}
protocol TestBProtocol: SomeProtocol {}
class TestA: TestAProtocol {}
class TestB: TestBProtocol {}
protocol Service {
associatedtype S: SomeProtocol
var service: S? { get }
}
class ServiceModule: Service {
var service: TestAProtocol?
}
此代碼有錯誤,因為 ServiceModule 中的服務類型是協議(TestAProtocol)(不是具體類型)。
class ServiceModule: Service {
var service: TestA?
}
或者
class ServiceModule: Service {
var service: TestB?
}
沒關系。
但我想要一個符合特定協議(例如 SomeProtocol)的協議(例如 TestAProtocol)的變量。
像這樣:
class ServiceModule: Service {
var service: TestAProtocol? // or var service: TestBProtocol?
}
可能嗎?
這不起作用,因為您沒有在 ServiceModule class 中指定關聯類型,並且 Swift 編譯器無法推斷基礎類型。 您應該將您的協議用作通用約束:
class ServiceModule<P: TestAProtocol>: Service {
var service: P?
}
這里P
是符合TestAProtocol
的具體類型,將在編譯時解析。 調用者(類 init)將定義關聯的類型。 這里P
的類型是TestA
。
let instance = ServiceModule<TestA>()
要理解的最重要的是,您不能將具有關聯類型的協議用作具體類型。 您只能:
some
關鍵字(僅適用於函數和計算屬性)返回一個不透明的類型來競標實現。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.