Swift泛型类型声明取决于先前声明的泛型类型

时间:2016-10-02 08:17:58

标签: swift generics

我正在第三方Swift库上构建一个包装器,我遇到了以下情况(简化后,我会在需要时添加更多详细信息):

class Displayer<Item> {

    let itemToBeDisplayed: Item

    init(itemToBeDisplayed: Item) {
        self.itemToBeDisplayed = itemToBeDisplayed
    }

    func display() { print("\(itemToBeDisplayed)") }

}

class EmojiDisplayer<Item>: Displayer<Item> {
    override func display() { print(" \(itemToBeDisplayed)") }
}

class TraditionalDisplayer<Item>: Displayer<Item> {
    override func display() { print("-> \(itemToBeDisplayed)") }
}

class MultipleItemsDisplayer<Item, DisplayerType: Displayer<Item>> {

    var items: [Item] = []

    func displayAll() {
        for item in self.items {
            DisplayerType(itemToBeDisplayed: item).display()
        }
    }

}

基本上,库有一个基础Displayer<GenericType>类。此类用于在UI中显示泛型类型的对象。

我正在创建一个通用的元素列表(MultipleItemsDisplayer),这些元素将使用Displayer的子类显示。我希望以编译器可以检测到大多数错误的方式公开该类,包括尝试使用与显示列表元素类型不匹配的Displayer

我的初始方法是将MultipleItemsDisplayer定义为具有两个关联类型的泛型类:Item,它定义显示列表的元素的类型,以及DisplayerType,它定义类型用于显示每个元素。

但这不能编译:

  

DisplayerType不是Displayer<Item>

的子类型

DisplayerType不是Displayer<Item>错误的子类型:

enter image description here

我目前正在使用Swift 2.2,但是这也不能用Swift 3编译(在使初始化程序需要使其与Swift-3兼容之后)。

我会重写这个以使用协议和相关类型而不是泛型类型,但我对这个问题感到好奇:这是对Swift泛型的限制,编译错误还是我的例子根本没有任何意义?< / p>

0 个答案:

没有答案