web-dev-qa-db-ja.com

AlamofireルータークラスをSwift 3に移行する方法は?

このアプローチ全体をSwift 3に変更する方法を知っている人はいますか?現時点では、これと非常によく似たものがありますSwift 2.2ですが、今はmそれを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
    }
}
}
12
Gabriel Candia

Alamofire 4.0.0リリース用に編集(スロー機能を備えた更新されたURLRequestConvertibleプロトコル):

lotが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が必要です(次のポイントと競合します)
  • さようならNSプレフィックスは多くの場所にあります。 NSURLRequestNSMutableURLRequestURLRequestになり、NSURLURLになります。
  • 関数とパラメーターに名前を付ける方法は、冗長性が大幅に減り、より自然になりました。たとえば、URLByAppendingPathComponentがどのように変更されたかを参照してください。

そしてAlamofirev4に関しては:

  • パラメータを自分でエンコードするための新しいParameterEncodingプロトコルがありますが、より用途が広いです。
  • ここでは影響を与えない他の多くの変更がありますが、それらについても読む必要があります。

そして最後のアドバイス:時間に敏感な場合は、プログラミング言語またはAPIのリリースされていないバージョンへの移行を避けてください。 Swift 3はそれほど動揺しませんが、Alamofireはまだ動揺する可能性があります!たとえば、ParameterEncodingプロトコルはたった2日しか経っていません!上記のバージョン)

乾杯

36
Jonas Zaugg