如何将 Alamofire 路由器类迁移到 Swift 3? [英] How to migrate Alamofire router class to Swift 3?

查看:20
本文介绍了如何将 Alamofire 路由器类迁移到 Swift 3?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

有谁知道如何将整个方法更改为 Swift 3?目前我有一些非常类似于在 Swift 2.2 上工作正常的东西,但现在我试图将其更改为 Swift 3.

我在URLRequestConvertible"、Alamofire.Method(我更改为 HTTPMethod 并且现在可以正常工作)以及参数编码方面遇到一些错误,此外我不符合整个协议.

我正在等待 Alamofire 工程师的指导,但我想看看在此期间我能完成什么.

enum 路由器:URLRequestConvertible {静态 let baseURLString = "http://example.com"静态变量 OAuthToken:字符串?案例 CreateUser([String: AnyObject])案例读取用户(字符串)案例更新用户(字符串,[字符串:AnyObject])案例销毁用户(字符串)var 方法:Alamofire.Method {切换自我{案例.CreateUser:返回.POST案例.ReadUser:返回 .GET案例.UpdateUser:返回.PUT案例.DestroyUser:返回 .DELETE}}变量路径:字符串{切换自我{案例.CreateUser:返回/用户"case .ReadUser(让用户名):返回/用户/(用户名)"case .UpdateUser(让用户名,_):返回/用户/(用户名)"case .DestroyUser(让用户名):返回/用户/(用户名)"}}//MARK: URLRequestConvertiblevar URLRequest: NSMutableURLRequest {让 URL = NSURL(string: Router.baseURLString)!让 mutableURLRequest = NSMutableURLRequest(URL: URL.URLByAppendingPathComponent(path))mutableURLRequest.HTTPMethod = method.rawValue如果让令牌 = Router.OAuthToken {mutableURLRequest.setValue("Bearer (token)", forHTTPHeaderField: "Authorization")}切换自我{案例.CreateUser(让参数):返回 Alamofire.ParameterEncoding.JSON.encode(mutableURLRequest, parameters: parameters).0case .UpdateUser(_, let 参数):返回 Alamofire.ParameterEncoding.URL.encode(mutableURLRequest, parameters: parameters).0默认:返回 mutableURLRequest}}}

解决方案

针对 Alamofire 4.0.0 版本进行了编辑(更新了具有抛出功能的 URLRequestConvertible 协议):

Swift 3 中的很多发生了变化,您应该首先真正阅读所有变化,也许从 http://swift.org.这是固定代码:

enum 路由器:URLRequestConvertible {static let baseURLString = "http://example.com";静态变量 OAuthToken:字符串?case createUser([String: AnyObject])案例读取用户(字符串)case updateUser(String, [String: AnyObject])案例销毁用户(字符串)var 方法:Alamofire.HTTPMethod {切换自我{案例.createUser:返回.post案例.readUser:返回 .get案例.updateUser:返回 .put案例.destroyUser:返回 .delete}}变量路径:字符串{切换自我{案例.createUser:返回/用户"案例.readUser(让用户名):返回/用户/(用户名)";case .updateUser(让用户名,_):返回/用户/(用户名)";案例.destroyUser(让用户名):返回/用户/(用户名)";}}func asURLRequest() 抛出 ->网址请求{让 url = URL(string: Router.baseURLString)!var urlRequest = URLRequest(url: url.appendingPathComponent(path))urlRequest.httpMethod = method.rawValue如果让令牌 = Router.OAuthToken {urlRequest.setValue("Bearer (token)", forHTTPHeaderField: "Authorization")}切换自我{案例.createUser(让参数):返回尝试 Alamofire.JSONEncoding.default.encode(urlRequest, with: parameters)case .updateUser(_, let 参数):返回尝试 Alamofire.URLEncoding.default.encode(urlRequest, with: parameters)默认:返回网址请求}}}

Swift 3 的主要变化是:

  • enum case 现在是小写的,你也应该采用它.
  • 变量名现在以小写开头,即使它是URL"这样的缩写.这就是为什么协议需要 var urlRequest 而不是 var URLRequest(这会与下一点冲突)
  • Bye-bye NS 前缀在很多地方.NSURLRequestNSMutableURLRequest 现在是 URLRequestNSURLURL,等等莉>
  • 您现在命名函数和参数的方式不再多余,而且更加自然.例如,查看 URLByAppendingPathComponent 的变化情况.

至于 Alamofire v4 :

  • 有一个新的 ParameterEncoding 协议来编码参数自己是不同的,但更通用
  • 许多其他更改在这里没有影响,但您肯定也必须阅读它们.

最后一句忠告:避免迁移到时间敏感的编程语言或 API 的未发布版本.Swift 3 不会有太大变化,但 Alamofire 仍然可能!例如,ParameterEncoding 协议只有两天的历史!(实际上它发生了变化,现在是上面的最终版本)

干杯

Does anybody know how to change this entire approach to Swift 3? At this moment I have something very similar to this working OK on Swift 2.2 but now I'm trying to change that to Swift 3.

I am getting some errors with the "URLRequestConvertible", with the Alamofire.Method (that I changed to HTTPMethod and now is working) and also with the parameter encoding, besides that I'm not conforming the entire protocol.

I'm waiting for guidance from engineers at Alamofire, but I am looking to see what I can accomplish in the meantime.

enum Router: URLRequestConvertible {
static let baseURLString = "http://example.com"
static var OAuthToken: String?

case CreateUser([String: AnyObject])
case ReadUser(String)
case UpdateUser(String, [String: AnyObject])
case DestroyUser(String)

var method: Alamofire.Method {
    switch self {
    case .CreateUser:
        return .POST
    case .ReadUser:
        return .GET
    case .UpdateUser:
        return .PUT
    case .DestroyUser:
        return .DELETE
    }
}

var path: String {
    switch self {
    case .CreateUser:
        return "/users"
    case .ReadUser(let username):
        return "/users/(username)"
    case .UpdateUser(let username, _):
        return "/users/(username)"
    case .DestroyUser(let username):
        return "/users/(username)"
    }
}

// MARK: URLRequestConvertible

var URLRequest: NSMutableURLRequest {
    let URL = NSURL(string: Router.baseURLString)!
    let mutableURLRequest = NSMutableURLRequest(URL: URL.URLByAppendingPathComponent(path))
    mutableURLRequest.HTTPMethod = method.rawValue

    if let token = Router.OAuthToken {
        mutableURLRequest.setValue("Bearer (token)", forHTTPHeaderField: "Authorization")
    }

    switch self {
    case .CreateUser(let parameters):
        return Alamofire.ParameterEncoding.JSON.encode(mutableURLRequest, parameters: parameters).0
    case .UpdateUser(_, let parameters):
        return Alamofire.ParameterEncoding.URL.encode(mutableURLRequest, parameters: parameters).0
    default:
        return mutableURLRequest
    }
}
}

解决方案

EDITED for Alamofire 4.0.0 release (updated URLRequestConvertible protocol with throwing capabilities):

A lot has changed in Swift 3 and you should first really read up on all the changes, maybe starting at http://swift.org. Here's the fixed code:

enum Router: URLRequestConvertible {
    static let baseURLString = "http://example.com"
    static var OAuthToken: String?
    
    case createUser([String: AnyObject])
    case readUser(String)
    case updateUser(String, [String: AnyObject])
    case destroyUser(String)
    
    var method: Alamofire.HTTPMethod {
        switch self {
        case .createUser:
            return .post
        case .readUser:
            return .get
        case .updateUser:
            return .put
        case .destroyUser:
            return .delete
        }
    }
    
    var path: String {
        switch self {
        case .createUser:
            return "/users"
        case .readUser(let username):
            return "/users/(username)"
        case .updateUser(let username, _):
            return "/users/(username)"
        case .destroyUser(let username):
            return "/users/(username)"
        }
    }
    
    func asURLRequest() throws -> URLRequest {
        let url = URL(string: Router.baseURLString)!
        var urlRequest = URLRequest(url: url.appendingPathComponent(path))
        urlRequest.httpMethod = method.rawValue
        
        if let token = Router.OAuthToken {
            urlRequest.setValue("Bearer (token)", forHTTPHeaderField: "Authorization")
        }
        
        switch self {
        case .createUser(let parameters):
            return try Alamofire.JSONEncoding.default.encode(urlRequest, with: parameters)
        case .updateUser(_, let parameters):
            return try Alamofire.URLEncoding.default.encode(urlRequest, with: parameters)
        default:
            return urlRequest
        }
    }
}

The main changes for Swift 3 are :

  • enum cases are now lowercase and you should adopt it too.
  • Variable names now start with lowercase, even if it's an abbreviation like "URL". That why the protocol requires var urlRequest and not var URLRequest (and it would conflict with the next point)
  • Bye-bye NS prefix in many places. NSURLRequest and NSMutableURLRequest are now URLRequest, NSURL is URL, etc.
  • How you name your functions and parameters is now a lot less redundant and more natural. See for example how URLByAppendingPathComponent has changed.

And as for Alamofire v4 :

  • There's a new ParameterEncoding protocol to encoding parameters yourself is different but more versatile
  • MANY other changes which have no impact here but you sure have to read about them too.

And final word of advice : avoid migrating to unreleased versions of a programming language or API if it's time-sensitive. Swift 3 won't budge much but Alamofire still might! For example the ParameterEncoding protocol is only two days old! (EDIT: and indeed it changed since, now in its final version above)

Cheers

这篇关于如何将 Alamofire 路由器类迁移到 Swift 3?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆