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

Gab*_*dia 12 ios swift alamofire swift3

有谁知道如何改变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
    }
}
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*ugg 36

已为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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Swift 3的主要变化是:

  • enum 案件现在是小写的,你也应该采用它.
  • 变量名现在以小写开头,即使它是"URL"之类的缩写.这就是为什么协议需要var urlRequest而不是var URLRequest(并且它会与下一点发生冲突)
  • NS许多地方的再见前缀.NSURLRequestNSMutableURLRequest现在URLRequest,NSURLURL
  • 如何命名您的功能和参数现在更加冗余和自然.例如,参见如何URLByAppendingPathComponent更改.

至于Alamofire v4:

  • ParameterEncoding编码参数的新协议本身不同但功能更多
  • 许多其他没有影响的变化,但你肯定也要阅读它们.

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

干杯

  • 我得到的错误是:`类型'路由器'不符合协议'URLRequestConvertible'`以及`Alamofire.ParameterEncoding.json.encode(mutableURLRequest,parameters:parameters).0`和` Alamofire.ParameterEncoding.urlEncodedInURL.encode(mutableURLRequest,参数:URLParameters).0`in swift 3? (4认同)