簡體   English   中英

swift 協議關聯類型

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM