一尘不染

如何将Alamofire路由器类迁移到Swift 3?

swift

有人知道如何将整个方法更改为Swift 3吗?目前,我有一些与Swift 2.2上的OK正常工作类似的东西,但现在我正尝试将其更改为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
    }
}
}

阅读 220

收藏
2020-07-07

共1个答案

一尘不染

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

一个 很多
已经在斯威夫特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前缀在很多地方。NSURLRequestNSMutableURLRequest现在URLRequestNSURLURL
  • 现在,如何命名函数和参数的冗余度大大降低,变得更加自然。例如,查看如何URLByAppendingPathComponent更改。

至于Alamofire v4:

  • 有一种新的ParameterEncoding协议可以自己编码参数,但用途更多
  • 许多其他更改对此没有影响,但是您一定也必须阅读它们。

最后的建议是:如果时间敏感,请避免迁移到未发布的编程语言或API版本。Swift
3不会花太多钱,但Alamofire仍然可以!例如,ParameterEncoding协议只有两天了!(编辑:实际上,此后它已经更改,现在在上面的最终版本中)

干杯

2020-07-07