将对象转换为泛型

时间:2015-10-24 18:00:42

标签: swift generics

我正在创建一个在不同场合使用的功能。但为此,我需要将函数的返回转换为我在此main函数中作为泛型传递的Object。

func makeRequestToApi<T>(object: T, url: String) {
    Alamofire.request(.GET, url).responseJSON { request in
        if let json = request.result.value {
            dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0)) {
                let data = JSON(json)
                let object: [T] = self.createProductObject(data) as Any as! [T]

                dispatch_async(dispatch_get_main_queue()) {
                    self.delegate?.networkingDidUpdate(object)
                }
            }
        }
    }
}

我以为我只需要这样打电话:

networkingController.makeRequestToApi(Product, url: Urls.menu)

此函数将返回一系列产品self.createProductObject(data) -> [Product]

但Xcode让我将.self添加到makeRequestToApi中的第一个参数

networkingController.makeRequestToApi(Product.self, url: Urls.menu)

这样,正如我所见,Swift不会将我的类的返回值转换为Product,因为我需要它。

任何人都知道我需要做什么?

谢谢。

1 个答案:

答案 0 :(得分:0)

你可能想要这样的东西:

func makeRequestToApi<T>(create: JSON -> [T], url: String) {
    Alamofire.request(.GET, url).responseJSON { request in
        if let json = request.result.value {
            dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0)) {
                let data = JSON(json)
                let object = create(data)

                dispatch_async(dispatch_get_main_queue()) {
                    self.delegate?.networkingDidUpdate(object)
                }
            }
        }
    }
}

makeRequestToApi(createProductObject, url: Urls.menu)

编辑:这为我编译(你可能需要调整你的委托方法):

import Foundation

struct Product {}

protocol Delegate : class {
    func networkingDidUpdate<T>(obj: [T])
}

class Test {
    weak var delegate : Delegate?

    func makeRequestToApi<T>(create: JSON -> [T], url: String) {
        Alamofire.request(.GET, url).responseJSON { request in
            guard let json = request.result.value else { return }

            dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0)) {

                let object = create(JSON(json))

                dispatch_async(dispatch_get_main_queue()) {
                    self.delegate?.networkingDidUpdate(object)
                }
            }
        }
    }

    func createProductObject(json: JSON) -> [Product] {
        return [Product()]
    }
}


let test = Test()
test.makeRequestToApi(test.createProductObject, url: "")