2017-05-19 98 views
2

我试图在RequestManager中创建一个通用函数,通过ServiceManager将接收到的JSON从服务器转换为指定类型。这是我的代码:泛型类型错误:无法明确地专门化泛型

RequestManager:

typealias ResultResponseManager = (_ data: AnyObject?, _ error: ErrorPortage?) -> Void 
typealias SuccessResponseManager = (_ success: Bool, _ error: ErrorPortage?) -> Void 
typealias objectBlock<T:GenericModel> = (_ object: T?, _ error: ErrorPortage?) -> Void 

extension RequestManager { 

    static func getObject<T: GenericModel>(endpoint: String, completionBlock: objectBlock<T>? = nil){ 

     RequestHelper(url: "\(getAPIURL())\(endpoint))") 
      .performJSONLaunchRequest { (result, error) in 

       if let result = result as? NSDictionary, 
        error == nil { 
        let object = T(dic: result) 
        completionBlock?(object, nil) 
       } 
       else { 
        completionBlock?(nil, error) 
       } 
     } 
    } 


} 

ServiceManger:

typealias ObjectResult = (GenericModel?, ErrorPortage?) -> Void 
typealias ObjectsResult = ([GenericModel]?, ErrorPortage?) -> Void 

extension ServiceManager { 

    static func getUser(_ id: Int? = nil, _ completion: ObjectResult? = nil) { 

     guard let userId: Int = id ?? UserManager.shared.userId else { 

      return 
     } 

     RequestManager.getObject<User>(endpoint: "users/\(userId)") { (user, error) in 
      if user = user { 

       //update userdefault 
       if userId == UserManager.shared.userId { 
        UserDefaults.standard.set(result, forKey: "currentUser") 
       } 
      } 
     } 
    } 
} 

上线RequestManager.getObject<User> ...我得到这个错误:

Cannot explicitly specialise a generic type

那么我在这里错过了什么?

The problem was solved thanks to luk2302

更新 任何想法如何可能改善这种代码或使其更干净! 注意:这不是一个问题,它只是关于良好的编程习惯

回答

3

比较https://stackoverflow.com/a/35372990/2442804 - 你不能指定类型约束“手工”。你必须让编译器推断它。做到这一点通过:

RequestManager.getObject(endpoint: "users/\(userId)") { (user : User?, error) in 
    // ... your normal code 
+0

谢谢:)你可以检查我的更新(它只是有干净的代码,也许能够更好地组织我的代码) – Chlebta

+1

@Chlebta我会去与相关的值枚举为'错误'和'成功'案例。这样你就有一种编译器强制的方式来接收错误信息或实际的对象。有一些关于SO的文章(现在找不到它们),对于评论部分来说更详细的内容太多了。除了枚举,我认为你的代码很好。 – luk2302