简体   繁体   English

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

[英]How to use generics as params?(Swift 2.0)

Code in playground is here 操场上的代码就在这里

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)
    }
}

But in the line re.setData(list) 但在行re.setData(list)

get compile error: 得到编译错误:

Cannot convert value of type '[ProductModel]' to expected argument type '[_]'. 无法将'[ProductModel]'类型的值转换为预期的参数类型'[_]'。

My Question is How to use setData method in GenericListProtocol ? 我的问题是如何在GenericListProtocol使用setData方法?

Anyone could help will be appreciated. 任何人都可以提供帮助,我

Moving the ProductModel type into the extension and removing the constraint from the generic protocol seems to work. 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)
    }
}

I found this question interesting and thought how best we could solve it in generic way. 我发现这个问题很有意思,并认为我们如何以通用的方式解决它。

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)

Appreciate your thought and suggestion if it can be improved further. 如果可以进一步改进,请欣赏您的想法和建议。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM