使用通用函数

时间:2016-03-04 11:08:57

标签: ios iphone swift generics alamofire

我有以下映射类。您将看到我使用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
        }
    }
}

Lik你知道我想传递Mappable类并返回Object类。但这会产生以下编译器错误:

Generic parameter 'T' is not used in function signature

Unexpected non-void return value in void function

有人可以帮我吗?如果您需要更多信息,请询问!

1 个答案:

答案 0 :(得分:0)

我没有看到完整的代码,因为编译错误说,有两个问题,一个用于&#39; T&#39;在您的函数中没有使用,另一个在函数中没有返回。

修复应该类似于:

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