2015-01-15 14 views
10

私はこのクラスを使って、バックエンドに対してユーザーを認証します。 success(response)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) 
      } 
     } 
    } 

} 

私はType of expression is ambiguous without more contextを取得しています。何か案は?

このクラスを書くには、より良い、より賢い方法がありますか?

+0

宣言応答をさせ 'として応答(RES:NSHTTPURLResponse、JSON:JSON、からstatusCode:はhttpStatus)=( res:res、json:JSON(json!)、statusCode:httpStatus) 'それが詳細をスローするかどうかを確認する – gabuh

+0

タプルメンバー名を削除してみてください。 – mattt

答えて

6

コンパイルしていないのは、成功タプル宣言の周りに余分な括弧があるということでした。それらを削除すると、コンパイルされます。ここではコンパイルされる可能性のある変更を少なくして、関数の更新版を示します。

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
+0

それはたくさんの意味があります!多くの人に感謝します。 – Thanos