¿Cómo usar generics como params? (Swift 2.0)

El código en el patio está aquí

class ProductModel { var productID : Int = 0 init(id:Int) { productID = id } } protocol GenericListProtocol { typealias T = ProductModel var list : [T] { get set } var filtenetworkinglist : [T] { get set } func setData(list : [T]) } extension GenericListProtocol { func setData(list: [T]) { list.forEach { item in guard let productItem = item as? ProductModel else { return } print(productItem.productID) } } } class testProtocol { class func myfunc<N:GenericListProtocol>(re:N){ var list : [ProductModel] = [ProductModel(id: 1),ProductModel(id: 2),ProductModel(id: 3),ProductModel(id: 4)] re.setData(list) } } 

Pero en la línea re.setData(list)

get error de compilation:

No se puede convertir el valor del tipo '[ProductModel]' al tipo de argumento esperado '[_]'.

Mi pregunta es ¿Cómo usar el método GenericListProtocol en GenericListProtocol ?

Cualquier persona que pueda ayudar será apreciada.

Mover el tipo de model de producto a la extensión y eliminar la restricción del protocolo genérico parece funcionar.

 class ProductModel { var productID : Int = 0 init(id:Int) { productID = id } } protocol GenericListProtocol { typealias T var list : [T] { get set } var filtenetworkinglist : [T] { get set } func setData(list : [T]) } extension GenericListProtocol { func setData(list: [ProductModel]) { list.forEach { item in print(item.productID) } } } class testProtocol { class func myfunc<N:GenericListProtocol>(re:N) { let list : [ProductModel] = [ProductModel(id: 1),ProductModel(id: 2),ProductModel(id: 3),ProductModel(id: 4)] re.setData(list) } } 

Encontré esta pregunta interesante y pensé en la mejor manera de resolverlo de manera genérica.

 protocol Product { var productID : Int {get set} } class ProductModel: Product { var productID : Int = 0 init(id:Int) { productID = id } } protocol GenericListProtocol { typealias T : Product var list : [T] { get set } var filtenetworkinglist : [T] { get set } } extension GenericListProtocol { func setData(list: [T]) { list.forEach { item in print(item.productID) } } } class GenericListProtocolClass : GenericListProtocol { typealias T = ProductModel var intVal = 0 var list = [T]() var filtenetworkinglist = [T]() } class testProtocol { class func myfunc(re: GenericListProtocolClass){ let list : [ProductModel] = [ProductModel(id: 1),ProductModel(id: 2),ProductModel(id: 3),ProductModel(id: 4)] re.setData(list) } } let temp = GenericListProtocolClass() testProtocol.myfunc(temp) 

Aprecie su pensamiento y sugerencia si se puede mejorar aún más.