web-dev-qa-db-ja.com

Swift:タプルをコールバック関数に渡そうとすると「あいまいな式」が発生する

バックエンドに対してユーザーを認証するためのこのクラスがあります。

_class BackendService {


class func performLogin(#email: String, password: String, success:((res: NSHTTPURLResponse, json: JSON, statusCode: HTTPStatus))->(), failure: (NSError)->()) {

    let loginURL = baseURL + "/login"
    let parameters = ["email": email, "password": password]

    Alamofire.request(.POST, loginURL, parameters: parameters).responseJSON { (req, res, json, err) in

        if(err != nil) {
            let response = (error: err!)
            failure(response)
        }
        else {


            if let httpStatus = HTTPStatus(rawValue: res!.statusCode) {
                let response = (res: res, json: JSON(json!) , statusCode: httpStatus)
                success(response)
            }
        }
    }

}
_

success(response)で_Type of expression is ambiguous without more context_を取得しています。何か案は?

このクラスを書くためのより良い、より迅速な方法はありますか?

10
Thanos

コンパイルされなかった理由は、成功したタプル宣言の周りに余分な括弧のセットがあったためです。それらを削除すると、コンパイルされます。これは、コンパイルする変更をできるだけ少なくした関数の更新バージョンです。

baseURLがどこかに定義されていることを確認する必要があります。

_class func performLogin(#email: String, password: String, success:(res: NSHTTPURLResponse, json: JSON, statusCode: HTTPStatus)->(), failure: (NSError)->()) {

    let loginURL = baseURL + "/login"
    let parameters = ["email": email, "password": password]

    Alamofire.request(.POST, loginURL, parameters: parameters).responseJSON { (req, res, json, err) in

        if (err != nil) {
            let response = (error: err!)
            failure(response)
        }
        else {
            if let httpStatus = HTTPStatus(rawValue: res!.statusCode) {
                let response = (res: res!, json: JSON(json!), statusCode: httpStatus)
                success(response)
            }
        }
    }
}
_

これは確かにクリーンな元の関数の更新バージョンですが、まだ完全に安全ではありません。経験則として、感嘆符が多いほどリスクが高くなります。

_typealias LoginSuccessHandler = (NSHTTPURLResponse, JSON, HTTPStatus) -> Void
typealias LoginFailureHandler = (NSError) -> Void

class func performLogin(#email: String, password: String, success: LoginSuccessHandler?, failure: LoginFailureHandler?) {
    let loginURL = baseURL + "/login"
    let parameters = ["email": email, "password": password]

    Alamofire.request(.POST, loginURL, parameters: parameters).responseJSON { request, response, json, error in
        if let error = error {
            failure?(error)
        } else {
            if let httpStatus = HTTPStatus(rawValue: response!.statusCode) {
                success?(response!, JSON(json!), httpStatus)
            }
        }
    }
}
_

_Alamofire.Request_クラスに組み込まれている@matttのすばらしい検証ロジックを実際に確認する必要があります。そうすれば、HTTPStatus列挙の必要性を完全に取り除くことができます。

  • public func validate() -> Self
  • public func validate(contentType array: [String]) -> Self
  • public func validate(statusCode array: [Int]) -> Self
  • public func validate(statusCode range: Range<Int>) -> Self
  • public func validate(validation: Validation) -> Self
6
cnoon