如何将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前缀。 NSURLRequestNSMutableURLRequest现在是URLRequestNSURLURL
  • 你如何命名你的函数和参数现在是多余的,更自然的。 例如,请参阅URLByAppendingPathComponent如何更改。

至于Alamofire v4:

  • 有一个新的ParameterEncoding协议来编码参数自己是不同的,但更多才多艺
  • 很多其他的改变在这里没有任何影响,但是你也一定要阅读。

最后的build议是:如果时间敏感,避免迁移到未发布的编程语言或API版本。 斯威夫特3不会太多,但阿拉莫菲尔还是可以的! 例如ParameterEncoding协议只有两天的时间! (编辑:事实上,自从现在在上面的最终版本中改变了)

干杯