首页 \ 问答 \ 在Swift中使用AlamoFire创建通用方法(Creating a generic method with AlamoFire in Swift)

在Swift中使用AlamoFire创建通用方法(Creating a generic method with AlamoFire in Swift)

我正在使用AlamoFire进行API调用,并且在我的项目中都有这样的东西:

static func login(userName: String, password: String) -> User {
    let parameters = ["userName": userName , "password": password]
    let user = User()
    Alamofire.request(.POST, "myserver.com/login", parameters: parameters, encoding: .JSON)
        .validate()
        .responseObject { (response: Response<User, NSError>) in
            switch response.result {
            case .Success(let value):
                user.valueHandle?(value)
            case .Failure(let error):
                user.errorHandle?(error)
            }
    }

    return user
}

(有关我如何提出上述代码,请参阅https://stackoverflow.com/a/37949671/406322 )。

问题是我有很多除User之外的对象,并且只有对象类型不同的代码重复,所以我试图创建一个泛型方法,如下所示:

static func sendRequest<T>(method: Alamofire.Method, urlString: String, parameters: [String: AnyObject]?) -> T {
        let response : T
        Alamofire.request(method, urlString, parameters:parameters)
            .validate()
            .responseObject { (response: Response<T, NSError>) in
                switch response.result {
                case .Success(let value):
                    response.valueHandle?(value)
                case .Failure(let error):
                    response.errorHandle?(error)
                }
        }

        return response 
 }

但斯威夫特抱怨道:

Cannot convert value of type '(Response<T, NSError>) -> ()' to expected argument type 'Response<_, NSError> -> Void'

这是我可以做这样的事情:

User.swift
static func login(userName: String, password: String) -> User {
        let parameters = ["userName": userName, "password": password]
    return sendRequest<User>(.GET, "http://myserver.com/users", parameters)
}

在我的调用代码中:

User.login(txtUserName.text!, password: txtPassword.text!)
            .success { (value) in
                var user = value as! User
                //do something with user
            }
            .error { (error) in
                //show error
            }

我做得不对劲?


I am using AlamoFire for my API calls, and have something like this all over my project:

static func login(userName: String, password: String) -> User {
    let parameters = ["userName": userName , "password": password]
    let user = User()
    Alamofire.request(.POST, "myserver.com/login", parameters: parameters, encoding: .JSON)
        .validate()
        .responseObject { (response: Response<User, NSError>) in
            switch response.result {
            case .Success(let value):
                user.valueHandle?(value)
            case .Failure(let error):
                user.errorHandle?(error)
            }
    }

    return user
}

(see https://stackoverflow.com/a/37949671/406322 on how I came up with the above code).

The problem is that I have a lot of objects other than User and there is code repetition with only the type of the object different, so I'm trying to create a generic method, something like this:

static func sendRequest<T>(method: Alamofire.Method, urlString: String, parameters: [String: AnyObject]?) -> T {
        let response : T
        Alamofire.request(method, urlString, parameters:parameters)
            .validate()
            .responseObject { (response: Response<T, NSError>) in
                switch response.result {
                case .Success(let value):
                    response.valueHandle?(value)
                case .Failure(let error):
                    response.errorHandle?(error)
                }
        }

        return response 
 }

But Swift is complaining:

Cannot convert value of type '(Response<T, NSError>) -> ()' to expected argument type 'Response<_, NSError> -> Void'

This is so I can do something like this:

User.swift
static func login(userName: String, password: String) -> User {
        let parameters = ["userName": userName, "password": password]
    return sendRequest<User>(.GET, "http://myserver.com/users", parameters)
}

and in my calling code:

User.login(txtUserName.text!, password: txtPassword.text!)
            .success { (value) in
                var user = value as! User
                //do something with user
            }
            .error { (error) in
                //show error
            }

What am I not doing right?


原文:https://stackoverflow.com/questions/37995945
更新时间:2020-02-28 15:54

最满意答案

您可以使用BaseObject轻松完成此操作:

class BaseUser: ResponseObjectSerializable {
    var valueHandle : ((BaseUser)->())?
    var errorHandle : ((NSError)->())?

    required init?(response: NSHTTPURLResponse, representation: AnyObject) {

    }
}



func sendRequest<T:BaseUser>(method: Alamofire.Method, urlString: String, parameters: [String: AnyObject]?) -> T {
    let res : T
    Alamofire.request(method, urlString, parameters:parameters)
        .validate()
        .responseObject { (response: Response<T, NSError>) in
            switch response.result {
            case .Success(let value):
                res.valueHandle?(value)
            case .Failure(let error):
                res.errorHandle?(error)
            }
    }

    return res
}

class可以保存句柄,使用baseobj你不需要使用协议一次又一次地写它们


you can use a BaseObject to do this easy :

class BaseUser: ResponseObjectSerializable {
    var valueHandle : ((BaseUser)->())?
    var errorHandle : ((NSError)->())?

    required init?(response: NSHTTPURLResponse, representation: AnyObject) {

    }
}



func sendRequest<T:BaseUser>(method: Alamofire.Method, urlString: String, parameters: [String: AnyObject]?) -> T {
    let res : T
    Alamofire.request(method, urlString, parameters:parameters)
        .validate()
        .responseObject { (response: Response<T, NSError>) in
            switch response.result {
            case .Success(let value):
                res.valueHandle?(value)
            case .Failure(let error):
                res.errorHandle?(error)
            }
    }

    return res
}

class can hold the handle ,and with the baseobj you don't need to write them again and again by using protocol

2016-06-23

相关文章

更多

最新问答

更多
  • css在元素之前中断列而不破坏包装器(css break column before element without breaking the wrapper)
  • 如何在Xamarin共享项目中使用自定义渲染器(How to use Custom Renderer in Xamarin Shared Project)
  • 如何为特定表中的特定字段设置唯一?(How to set unique for specific field from specific table?)
  • Google SDK iOS - sign()方法完成处理程序(Google SDK iOS - sign() method completion handler)
  • 在具有接口{}值的地图上实现String()(Implement String() on a map with interface{} values)
  • 检查数据库中是否已存在用户名(Check if username already exist in DB)
  • 使用javascript进行ajax调用时阻止用户交互(Block user interaction while doing ajax call using javascript)
  • 什么'if(err)'在Javascript中精确测试?(What does 'if (err)' tests precisely in Javascript?)
  • jQuery mouseleave无法正常工作(jQuery mouseleave not working)
  • 寻求使用的一些说明(Seeking some clarification on use of )
  • 将数组传递给注释的语法(syntax for passing array to annotation)
  • 用于从两个日期范围之间的文件中提取数据的Shell脚本(Shell script to extract data from file between two date ranges)
  • 元素隐藏但父()没有(Element hides but parent() not)
  • 如何使用Google App Engine Java平台开发web ui(How to develop web ui with Google App Engine Java platform)
  • 对于OWL A级;(For an OWL class A; Getting all properties that A is their domain)
  • Excel VBA公式格式问题(Excel VBA Formula Format Issue)
  • ORA - 02287序列号不允许在这里(ORA - 02287 sequence number not allowed here)
  • Github拉忽略特定文件(Github Pull Ignore Specific File)
  • SQL CONVERT函数在SQL Server中工作但不在应用程序中(SQL CONVERT function working in SQL Server but not in application)
  • backbone.js适用于大型应用程序(backbone.js for large applications)
  • 防止程序关闭(Preventing program from closing)
  • 生成不带图像的heightMap(Generating a heightMap without an Image)
  • Bootstrap - 如何将包含文本的div居中?(Bootstrap - How to center div that has text inside it?)
  • Android - 片段findViewById()总是null?(Android - Fragment findViewById() always null?)
  • 确定CSS中的高度(Figuring out heights in CSS)
  • 使用__autoload包含类和使用命名空间(Use __autoload to include class and use namespace)
  • setTimeout()不允许我传递文本值[重复](setTimeout() doesn't allow me to pass text values [duplicate])
  • 在NSUserDefault中恢复值(Restoring value in NSUserDefault)
  • 知道如何将这种下沉的悬停效果添加到图像/链接吗?(Any idea how to add this sinking hover effect to an image/link?)
  • 在XIB中淡入/淡出UISegmentedControl(fade in/fade out UISegmentedControl in XIB)