具有元类型的泛型数组(使用AlamofireObjectMapper)

时间:2016-04-08 13:51:11

标签: swift generics alamofire

我怀疑我可能犯了与Rob在post here中所描述的相同的错误,因为我应该以另一种方式做这件事,但考虑到这一点:

我试图以通用的方式使用AlamofireObjectMapper。它有一个协议

public protocol Mappable

然后我有各种采用它的模型类

class Dog: Mappable
class Cat: Mappable
class Bird: Mappable

我有这个方法

func loadEntityArray<T: Mappable>(type: T.Type)

这是通用的原因是因为它调用了一个函数load(),它需要一个使用这个泛型参数的完成块。 &#39;类型&#39;从不实际使用参数,但是如果函数的参数列表中没有泛型类型,则无法生成函数。

func load(completion:(Response<T, NSError> -> Void))

从另一个方法

调用loadEntityArray
func letsgo() { loadEntityArray(Dog.self); loadEntityArray(Cat.self) }

到目前为止,这一切都很好。但我想传递一组数组加载到letsgo(),我不知道如何做到这一点。如果我将letsgo()更改为

func letsgo<T:Mappable>(models: [T.Type]) {
  for mod in models {
    loadEntityArray(mod)
  }
}

然后使用1个参数调用letsgo()

letsgo([Dog.self])

它可以工作,但是只要我有一个2或更多的数组,我就会得到编译器错误&#39;无法将NSArray类型的值转换为预期的参数类型[_.Type]&#39;我现在不知道如何明确地输入这个数组。

letsgo([Dog.self, Cat.self])

我尝试了各种排列,但似乎没有任何效果。我在这里做的事情不可能吗?在我看来,编译器在编译时有足够的信息可以使它工作,所以我不确定这是否是一个语法问题,或者我在这里做了一些错误的泛型。

2 个答案:

答案 0 :(得分:1)

看看你的功能:

func letsgo<T:Mappable>(models: [T.Type])

其模型参数应为所有相同类型的数组。所以只有狗类型的数组。这就是为什么

letsgo([Dog.self])

有效但

letsgo([Dog.self, Cat.self])

不会因为它有多种类型。

解决方案:

直接使用Mappable.Type:

func loadEntityArray(type: Mappable.Type) {}

func letsgo(models: [Mappable.Type]) {
    for mod in models {
        loadEntityArray(mod.self)
    }
}

并将您的Types数组转换为Mappable Types数组:

letsgo([Dog.self, Cat.self] as [Mappable.Type])

希望这可以实现您的目标!

答案 1 :(得分:0)

所以最后我得出的结论是,这是不可能的。我更改了代码,以便将枚举传递给letsgo(),并在该枚举上的switch语句中调用loadEntityArray(Dog.self)等,并使用显式编码调用,为每种可能的类型。然后编译器可以看到所有可能的类型并且很高兴。