簡體   English   中英

如何使用泛型函數擴展類型創建協議

[英]How to create a protocol with a generic function extending type

我正在嘗試使用泛型函數來執行協議,其中T不僅僅等於類型,而是擴展它。

class MainItem {}
class Item1: MainItem {}
class Item2: MainItem {}

protocol MyProtocol {
    func myFunc<T: MainItem>() -> T // T extends MainItem
}

class ClassA: MyProtocol {
    func myFunc() -> Item1 { // not MainItem
        return Item1()
    }
}

class ClassB: MyProtocol {
    func myFunc() -> Item2 { // not MainItem
        return Item2()
    }
}

但是我得到了這個錯誤

類型'ClassA'不符合協議'MyProtocol'

因為Item1不等於MainItem (它擴展了它)。 你怎么能讓它發揮作用?

例如,在Java中,一切都可以使用抽象類來完成:

abstract class MyProtocol {
    abstract <T extends MainItem> T myFunc()
}

泛型不是滿足您要求的方式。 在協議中聲明泛型函數時,泛型類型參數將表示相同的函數適用於滿足泛型類型限制的所有類型,但函數簽名仍需要對所有符合類型的函數完整。

您正在尋找的是具有相關類型協議 協議上的關聯類型意味着符合類型可以決定使用哪種具體類型來代替關聯類型,因此允許您在不同的符合類中使用不同的關聯類型。

protocol MyProtocol {
    associatedtype MyType: MainItem
    func myFunc() -> MyType
}

class ClassA: MyProtocol {
    func myFunc() -> Item1 {
        return Item1()
    }
}

class ClassB: MyProtocol {
    func myFunc() -> Item2 {
        return Item2()
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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