Как перенести класс маршрутизатора Alamofire в Swift 3?

Кто-нибудь знает, как изменить весь этот подход на 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
    }
}
}

Ответ 1

EDITED для выпуска Alamofire 4.0.0 (обновленный протокол URLRequestConvertible с возможностью метания):

A лот изменился в 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". Поэтому для протокола требуется var urlRequest, а не var urlRequest (и это противоречило бы следующей точке)
  • Bye-bye NS префикс во многих местах. NSURLRequest и NSMutableURLRequest теперь URLRequest, NSURL есть URL и т.д.
  • Как вы называете свои функции и параметры в настоящее время намного менее избыточными и более естественными. См. Например, как изменился URLByAppendingPathComponent.

А что касается Alamofire v4:

  • Новый протокол ParameterEncoding для параметров кодирования сам по себе отличается, но более универсален.
  • МНОГО других изменений, которые не имеют никакого влияния здесь, но вы обязательно должны прочитать о них тоже.

И последнее слово совета: не переходите к неизданным версиям языка программирования или API, если это зависит от времени. Swift 3 не сдвинется с места, но Alamofire все еще может! Например, протокол ParameterEncoding составляет всего два дня! (EDIT: и действительно, это изменилось, так как теперь в его окончательной версии выше)

Приветствия