2015-10-24 72 views
1

我正在创建一个函数以用于不同的场合。但为此,我需要将一个函数的返回值转换为在此主函数中作为泛型传递的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第一个参数in makeRequestToApi

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

这样,我看到,Swift不会将我的类的返回值转换为Product,因为我需要它。

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

谢谢。

回答

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: "")