2016-03-04 47 views
0

我有以下映射類。你會看到我使用ObjectMapperRealmSwift,因爲我想在Realm中保存這個類。使用通用函數

import Foundation 
import ObjectMapper 
import RealmSwift 

class LoginResponse: Object,Mappable { 

    dynamic var status: Int = 0 
    dynamic var client: LoginData! 

    required convenience init?(_ map: Map) { 
     self.init() 
    } 

    func mapping(map: Map) { 
     client <- map["client"] 
     status <- map["status"] 
    } 
} 

現在我有以下功能:

public func login(email: String, password: String) -> LoginResponse { 
     let request = RestoryApiRequest.login(email, password: password) 
     return request.toObjectMapper() 
    } 

下面你看到的APIRequest類:

import Foundation 
import Alamofire 
import ObjectMapper 
import AlamofireObjectMapper 
import RealmSwift 


struct ApiRequest { 
    let method: Alamofire.Method 
    let path: String 
    let parameters: [String: AnyObject]? 
    let uiRealm = try! Realm() 


    init(method: Alamofire.Method = .GET, path: String, parameters: [String: AnyObject]? = nil) { 
     self.method = method 
     self.path = "webservice/abc123/client/\(path)" 

     self.parameters = parameters 
    } 

    func toObjectMapper<T: Mappable>() -> Object { 
     let alomofireApiRequest = AlamofireApiRequest(apiRequest: self) 
     Alamofire.request(alomofireApiRequest) 
      .responseObject("") { (response: Response<T, NSError>) in 
       let parsedObject = response.result.value as! Object 
       try! self.uiRealm.write({() -> Void in 

        self.uiRealm.add(parsedObject) 
       }) 

       return parsedObject 
     } 
    } 
} 

瀝你看,我想通過可映射類,並給予對象類返回。但是,這給出了以下編譯器錯誤:

Generic parameter 'T' is not used in function signature 

Unexpected non-void return value in void function 

有人可以幫助我嗎?如果您需要更多信息,請詢問!

+1

第一個錯誤是從消息不夠清晰。編譯器如何識別T是什麼?你應該有與T有關的參數和/或返回值。第二個是因爲你返回了parseObject,你不應該這樣做。迴應 in相當於迴應 - >無效...所以你應該從封閉中不返回任何東西 – user3441734

回答

0

我沒有看到完整的代碼,因爲編譯錯誤說,有兩個問題,一個是'T'沒有用在你的函數中,另一個是你的函數沒有返回。

的修補程序應該與此類似:

// No Return, the result is in the completion block. 
func toObjectMapper<T: Mappable>(completion: (T)->Void) { 
    let alomofireApiRequest = AlamofireApiRequest(apiRequest: self) 
    Alamofire.request(alomofireApiRequest) 
     .responseObject("") { (response: Response<T, NSError>) in 

      // The parsedObject is already of class T 
      let parsedObject = response.result.value 
      try! self.uiRealm.write({() -> Void in 

       self.uiRealm.add(parsedObject) 
      }) 

      completion(parsedObject) 
    } 
}