如何将泛型用作参数?(Swift 2.0)



操场上的代码在这里

class ProductModel {
    var productID : Int = 0
    init(id:Int) {
        productID = id
    }
}

protocol GenericListProtocol {
    typealias T = ProductModel
    var list : [T] { get set }
    var filteredlist : [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)
    }
}

但在线路re.setData(list)

获取编译错误:

无法将类型为"[ProductModel]"的值转换为所需的参数键入'[_]'。

我的问题是如何在GenericListProtocol中使用setData方法?

任何能提供帮助的人都将不胜感激。

ProductModel类型移动到扩展中并从通用协议中删除约束似乎有效。

class ProductModel {
    var productID : Int = 0
    init(id:Int) {
        productID = id
    }
}
protocol GenericListProtocol {
    typealias T
    var list : [T] { get set }
    var filteredlist : [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)
    }
}

我发现这个问题很有趣,并思考如何最好地以通用的方式解决它。

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 filteredlist : [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 filteredlist = [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)

感谢你的想法和建议,如果可以进一步改进的话。

最新更新