我怀疑我可能犯了与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))
从另一个方法
调用loadEntityArrayfunc 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])
我尝试了各种排列,但似乎没有任何效果。我在这里做的事情不可能吗?在我看来,编译器在编译时有足够的信息可以使它工作,所以我不确定这是否是一个语法问题,或者我在这里做了一些错误的泛型。
答案 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)等,并使用显式编码调用,为每种可能的类型。然后编译器可以看到所有可能的类型并且很高兴。