【问题标题】:Working with generic function使用泛型函数
【发布时间】:2016-03-04 11:08:57
【问题描述】:

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

如您所见,我想传入 Mappable 类并返回 Object 类。但这会产生以下编译器错误:

Generic parameter 'T' is not used in function signature

Unexpected non-void return value in void function

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

【问题讨论】:

  • 第一个错误从消息中很清楚。编译器如何识别 T 是什么?你应该有类型与 T 相关的参数和/或返回值。第二个是因为你返回 parseObject 而你不应该。 Response in 相当于 Response->Void in ... 所以你不应该从闭包中返回任何内容

标签: ios iphone swift generics alamofire


【解决方案1】:

我没有看到完整的代码,正如编译错误所说,有两个问题,一个是你的函数中没有使用'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)
    }
}

【讨论】:

    猜你喜欢
    • 2017-06-07
    • 1970-01-01
    • 1970-01-01
    • 2020-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-01
    相关资源
    最近更新 更多