如何将 Alamofire 路由器 class 迁移到 Swift 3?
How to migrate Alamofire router class to Swift 3?
有人知道如何将整个方法更改为 Swift 3 吗?目前我有一些与此非常相似的东西在 Swift 2.2 上工作正常但现在我正在尝试将其更改为 Swift 3.
我在 "URLRequestConvertible"、Alamofire.Method(我已更改为 HTTPMethod,现在可以使用)以及参数编码方面遇到一些错误,除此之外我不符合整个协议。
我正在等待 Alamofire 工程师的指导,但我希望看看在此期间我能完成什么。
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
}
}
}
已编辑 Alamofire 4.0.0 版本(更新 URLRequestConvertible
具有投掷功能的协议):
一个 lot 在 Swift 3 中发生了变化,您应该首先真正阅读所有变化,也许从 http://swift.org 开始。这是固定代码:
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
}
}
}
Swift 3 的主要变化是:
enum
大小写现在是小写的,你也应该采用它。
- 变量名现在以小写字母开头,即使它是像“URL”这样的缩写。这就是为什么协议需要
var urlRequest
而不是 var URLRequest
(这会与下一点冲突)
- 拜拜
NS
前缀在很多地方。 NSURLRequest
和 NSMutableURLRequest
现在是 URLRequest
,NSURL
是 URL
,等等
- 您命名函数和参数的方式现在不再那么多余,而且更加自然。例如,查看
URLByAppendingPathComponent
的变化。
至于 Alamofire v4:
- 有一个新的
ParameterEncoding
参数自己编码协议是不同的,但更通用
- 许多其他更改在这里没有影响,但您肯定也必须阅读它们。
最后的建议:避免迁移到编程语言的未发布版本,或者 API 如果它对时间敏感。 Swift 3 不会有太大变化,但 Alamofire 仍然有可能!例如 ParameterEncoding
协议只有两天! (编辑:从那以后它确实发生了变化,现在是上面的最终版本)
干杯
有人知道如何将整个方法更改为 Swift 3 吗?目前我有一些与此非常相似的东西在 Swift 2.2 上工作正常但现在我正在尝试将其更改为 Swift 3.
我在 "URLRequestConvertible"、Alamofire.Method(我已更改为 HTTPMethod,现在可以使用)以及参数编码方面遇到一些错误,除此之外我不符合整个协议。
我正在等待 Alamofire 工程师的指导,但我希望看看在此期间我能完成什么。
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
}
}
}
已编辑 Alamofire 4.0.0 版本(更新 URLRequestConvertible
具有投掷功能的协议):
一个 lot 在 Swift 3 中发生了变化,您应该首先真正阅读所有变化,也许从 http://swift.org 开始。这是固定代码:
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
}
}
}
Swift 3 的主要变化是:
enum
大小写现在是小写的,你也应该采用它。- 变量名现在以小写字母开头,即使它是像“URL”这样的缩写。这就是为什么协议需要
var urlRequest
而不是var URLRequest
(这会与下一点冲突) - 拜拜
NS
前缀在很多地方。NSURLRequest
和NSMutableURLRequest
现在是URLRequest
,NSURL
是URL
,等等 - 您命名函数和参数的方式现在不再那么多余,而且更加自然。例如,查看
URLByAppendingPathComponent
的变化。
至于 Alamofire v4:
- 有一个新的
ParameterEncoding
参数自己编码协议是不同的,但更通用 - 许多其他更改在这里没有影响,但您肯定也必须阅读它们。
最后的建议:避免迁移到编程语言的未发布版本,或者 API 如果它对时间敏感。 Swift 3 不会有太大变化,但 Alamofire 仍然有可能!例如 ParameterEncoding
协议只有两天! (编辑:从那以后它确实发生了变化,现在是上面的最终版本)
干杯