我正在尝试存储使用关联类型的泛型,但是当尝试创建一种类型时,该类型应符合我在类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功能,这些功能也可以用作解决方案。
答案 0 :(得分:1)
B
符合Runnable
,是的,但是您不能将其放入应该存储AssociatedType
的数组中。因为AssociatedType
的实际类型是由类的调用者而不是类本身决定的。班级不能说“我希望AssociatedType
始终是B
”。在这种情况下,您最好删除AssociatedType
通用参数,并将其替换为B
。呼叫者可以将AssociatedType
设为Foo
或Bar
或任何符合Runnable
的内容。现在,您不得不输入B
。
我认为您应该重新考虑一下您的模型。问问自己是否真的想将AssociatedType
作为通用参数。
您可以考虑为Runnable
添加另一个要求:
init(data: DataType)
并将required
添加到B
的初始化程序中。这样,您可以这样写addAssociatedValue
:
func addAssociatedValue(data:DataType){ array.append(AssociatedType(data:data)) }