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

标签 ios swift alamofire swift3

有人知道如何将整个方法更改为 Swift 3 吗?目前,我有一些与此非常相似的东西在 Swift 2.2 上运行正常,但现在我正在尝试将其更改为 Swift 3。

我在使用“URLRequestConvertible”、Alamofire.Method(我已更改为 HTTPMethod,现在可以使用)以及参数编码时遇到一些错误,除此之外我没有遵守整个协议(protocol)。

我正在等待 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 版本进行了编辑(更新了具有 throw 功能的 URLRequestConvertible 协议(protocol)):

很多 在 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”这样的缩写。这就是为什么协议(protocol)需要 var urlRequest 而不是 var URLRequest (这会与下一点冲突)
  • 在许多地方告别 NS 前缀。 NSURLRequestNSMutableURLRequest 现在是 URLRequestNSURLURL,等等。<
  • 您命名函数和参数的方式现在不再那么多余,而且更加自然。例如,查看 URLByAppendingPathComponent 是如何更改的。

至于 Alamofire v4:

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

最后的建议:如果时间敏感,请避免迁移到编程语言或 API 的未发布版本。 Swift 3 不会有太大变化,但 Alamofire 仍然有可能!例如 ParameterEncoding 协议(protocol)只有两天! (编辑:从那以后它确实发生了变化,现在是上面的最终版本)

干杯

关于ios - 如何将 Alamofire 路由器类迁移到 Swift 3?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39412700/

相关文章:

ios - Alamofire 4 在后台完成请求

iOS 9.3 : An SSL error has occurred and a secure connection to the server cannot be made

ios - UICollectionView 中的 GCD 和单元格重用

objective-c - iPad 框架上的 UIActionSheet 太小

swift - 坐标设置时自定义 MKAnnotation 不移动

json - swift 如何检查来自 Json 的 NULL 值

ios - 如何将相机胶卷中的所有照片和视频插入阵列?

ios - 阻止我的 iOS 7 应用升级

ios - 无法在 SwiftUI 中使用 ForEach 和 CoreData 将数据正确传递给模态演示

swift - Alamofire GET请求参数