在集合中存储符合关联类型的泛型

时间:2018-07-31 00:17:13

标签: swift

我正在尝试存储使用关联类型的泛型,但是当尝试创建一种类型时,该类型应符合我在类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功能,这些功能也可以用作解决方案。

1 个答案:

答案 0 :(得分:1)

B符合Runnable,是的,但是您不能将其放入应该存储AssociatedType的数组中。因为AssociatedType的实际类型是由类的调用者而不是类本身决定的。班级不能说“我希望AssociatedType始终是B”。在这种情况下,您最好删除AssociatedType通用参数,并将其替换为B。呼叫者可以将AssociatedType设为FooBar或任何符合Runnable的内容。现在,您不得不输入B

我认为您应该重新考虑一下您的模型。问问自己是否真的想将AssociatedType作为通用参数。

您可以考虑为Runnable添加另一个要求:

init(data: DataType)

并将required添加到B的初始化程序中。这样,您可以这样写addAssociatedValue

func addAssociatedValue(data:DataType){     array.append(AssociatedType(data:data))   }