2016-04-08 36 views
0

我怀疑我可能会犯同样的错误在本post here在罗布描述我应该做这件事的另一种方式,但考虑到这一点:阵列仿制药与元类型(使用AlamofireObjectMapper)

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

public protocol Mappable 

我则有采用它的各种模型类

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

我有这样的方法

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

,这是通用的原因是因为它调用一个函数load()需要一个使用这个泛型参数的完成块。 'type'参数从来没有被实际使用过,但是如果没有泛型类型在func的参数列表中,你就不能创建一个通用类型。

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 PARAM像

letsgo([Dog.self]) 

它的工作原理调用letsgo(),但只要我有2个或更多的数组,我得到一个编译器错误“无法将类型NSArray的值转换为期望的参数类型[_.Type]'我现在不会如何明确地键入此数组。

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

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

+0

'loadEntityArray()'的目的是什么?你为什么试图使用类的类型作为参数? – ColGraff

+0

@KennethBruno问题已更新! – Brynjar

回答

1

看你的功能:

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

它的模型参数应该是所有同类型的数组。例如,只有一个Dog Types的数组。这就是为什么

letsgo([Dog.self]) 

的作品,但

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

不会因为它有多种类型。

解决办法:

使用映射的。直接键入:

func loadEntityArray(type: Mappable.Type) {} 

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

而且投你的类型数组作为可映射类型的数组:

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

希望,这达到你在找什么!

+1

不幸的是,loadEntityArray函数本身必须是通用的,因为它调用了类型T上通用的加载函数。 – Brynjar

0

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