我正在第三方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>
错误的子类型:
我目前正在使用Swift 2.2,但是这也不能用Swift 3编译(在使初始化程序需要使其与Swift-3兼容之后)。
我会重写这个以使用协议和相关类型而不是泛型类型,但我对这个问题感到好奇:这是对Swift泛型的限制,编译错误还是我的例子根本没有任何意义?< / p>