【问题标题】:How to migrate Alamofire router class to Swift 3?如何将 Alamofire 路由器类迁移到 Swift 3?
【发布时间】:2017-01-17 16:06:18
【问题描述】:

有人知道如何将整个方法更改为 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
    }
}
}

【问题讨论】:

  • 我遇到了同样的问题。你有没有找到任何解决方案。谢谢

标签: ios swift alamofire swift3


【解决方案1】:

为 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 case 现在是小写的,你也应该采用它。
  • 变量名称现在以小写字母开头,即使它是“URL”之类的缩写。这就是为什么该协议需要var urlRequest 而不是var URLRequest(它会与下一点冲突)
  • 再见NS 前缀在很多地方。 NSURLRequestNSMutableURLRequest 现在是 URLRequestNSURLURL,等等。
  • 现在,您如何命名函数和参数不再那么多余,而且更自然。例如,查看 URLByAppendingPathComponent 的变化情况。

至于 Alamofire v4:

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

最后的建议是:如果对时间敏感,请避免迁移到未发布的编程语言或 API 版本。 Swift 3 不会让步,但 Alamofire 仍然可能!例如ParameterEncoding 协议只有两天的历史! (编辑:事实上它改变了,现在在上面的最终版本中)

干杯

【讨论】:

  • 我得到的错误是:Type 'Router' does not conform to protocol 'URLRequestConvertible' 以及 Alamofire.ParameterEncoding.json.encode(mutableURLRequest, parameters: parameters).0Alamofire.ParameterEncoding.urlEncodedInURL.encode(mutableURLRequest, parameters: URLParameters).0in swift 3 的等价物是什么?
  • 感谢您的帮助:D.
  • 我不确定我是否喜欢 encode 通话中的 try!encode 调用抛出和 URLRequestConvertible 协议不允许 urlRequest 抛出或返回 nil 之间存在不匹配,我认为 try! 不是正确的方法。那只是允许代码编译,但丢弃了 Swift 在运行时的安全性。
  • 我也没有。问题的范围是帮助迁移,也就是让它编译。拥有ProgressEncoding 协议抛出是一个新的添加,它改变了 Alamofire 3.4 中的行为。我很高兴帮助 OP 使用 do {} catch{} 实现错误处理,但我不知道 OP 应用程序中期望的行为是什么。
  • @GabrielCandia 确保 var URLRequest: NSMutableURLRequestvar urlRequest: URLRequest,因为该属性是必需的(并且名称已更改)。
猜你喜欢
  • 2017-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多