我正在尝试存储一个使用关联类型的泛型,但是在尝试创建一个应该符合我在类 A 顶部的泛型列表中描述的泛型类型的类型时,我得到了错误。
“无法使用类型为‘(B)’的参数列表调用‘append’”
我怎样才能正确地声明泛型以使这段代码工作?
class A<DataType: Any, AssociatedType: Runable> where
AssociatedType.DataType == DataType {
var array = Array<AssociatedType>()
func addAssociatedValue(data: DataType) {
array.append(B(data: data))
}
func runOnAll(with data: DataType) {
for item in array {
item.run(with: data)
}
}
}
class B<DataType>: Runable {
init(data: DataType) { }
func run(with: DataType) { }
}
protocol Runable {
associatedtype DataType
func run(with: DataType)
}
我也在使用 Swift 4.2,所以如果有一个使用较新 Swift 功能之一的解决方案也可以作为解决方案。
最佳答案
B
符合Runnable
,是的,但是你不能将它放入一个应该存储AssociatedType
的数组中。因为 AssociatedType
的实际类型是由类的调用者决定的,而不是类本身。该类不能说“我希望 AssociatedType
始终为 B
”。如果是这种情况,您不妨删除 AssociatedType
泛型参数并将其替换为 B
。调用者可以将 AssociatedType
设为 Foo
或 Bar
或任何符合 Runnable
的类型。现在你强制放入一个 B
。
我认为您应该重新考虑一下您的模型。问问自己是否真的想要 AssociatedType
作为通用参数。
您可以考虑为 Runnable
添加另一个要求:
init(data: DataType)
并将required
添加到B
的初始化器中。这样,您可以像这样编写 addAssociatedValue
:
func addAssociatedValue(数据:数据类型){ array.append(关联类型(数据:数据))
关于swift - 在 A 集合中存储符合关联类型的泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51603860/