当前位置: 首页 > 面试题库 >

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

颛孙成益
2023-03-14
问题内容

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

问题答案:

针对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协议只有两天了!(编辑:实际上,此后它已经更改,现在在上面的最终版本中)

干杯



 类似资料:
  • 添加了一些与CLANG相关的新属性: 如何配置项目以使用Xcode12.5部署此应用程序? $React-本机信息获取系统和库信息...System:OS:macOS 11.3 CPU:(4)x64 Intel(R)Core(TM)i3-8100B CPU@3.60 GHz内存:256.45MB/8.00 GB shell:3.2.57-/bin/bash二进制文件:node:10.16.0-/u

  • 我升级为不和谐。JSV12,但它破坏了我现有的v11代码。下面是一些导致错误的示例: 如何将代码迁移到Discord。JSV12并修复这些错误?在哪里可以看到v12引入的突破性更改?

  • 我正在使用OpenJDK 12中的Nashorn JS引擎。纳肖恩似乎遭到了反对。我正在寻找可用的替代方案。我找到了GraalVM,但我不确定这是不是最好的。如何从Java执行GraalVM JavaScript?你有什么例子吗? Nashorn用的是Java: 在Nashorn中,我创建了一个WrappedMongoDatabase,它扩展了AbstractJSObject。在那里,我添加了一些

  • 问题内容: 将Express.js从版本2更新到了版本3,以下调用中断了,因为它不再存在于V3中: 有一个迁移指南说: (使用中间件+ res.locals) 但是我很困惑如何做到这一点。是否有一个更具体的示例说明如何进行迁移? 相关的SO post: Node.js Express3.0 问题答案: 我有同样的问题 session.user ,只是通过了解该app.use功能必须是固定的, 在

  • 问题内容: 我有一个带有几个表的mysql数据库,我想将mysql数据迁移到ElasticSearch。通过批处理作业很容易将整个数据库迁移到ES。但是我应该如何从MySQL实时更新ES。即,如果在mysql中有更新操作,那么我应该在ES中执行相同的操作。我研究了mysql binLog,它可以反映mysql的任何更改。但是我必须将binLog解析为ES语法,我认为这确实很痛苦。谢谢!(与Solr