如何将Alamofire路由器类迁移到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
协议与投掷能力):
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
情况现在是小写,你也应该采用它。 - 现在,variables名称以小写字母开头,即使它是“URL”的缩写。 那为什么协议需要
var urlRequest
而不是var URLRequest
(并且会和下一个点冲突) - 在许多地方再见
NS
前缀。NSURLRequest
和NSMutableURLRequest
现在是URLRequest
,NSURL
是URL
等 - 你如何命名你的函数和参数现在是多余的,更自然的。 例如,请参阅
URLByAppendingPathComponent
如何更改。
至于Alamofire v4:
- 有一个新的
ParameterEncoding
协议来编码参数自己是不同的,但更多才多艺 - 很多其他的改变在这里没有任何影响,但是你也一定要阅读。
最后的build议是:如果时间敏感,避免迁移到未发布的编程语言或API版本。 斯威夫特3不会太多,但阿拉莫菲尔还是可以的! 例如ParameterEncoding
协议只有两天的时间! (编辑:事实上,自从现在在上面的最终版本中改变了)
干杯