2015-01-15 15 views
10

Bir kullanıcının arka uçuma karşı kimlik doğrulaması yapmak için bu sınıfa sahibim. Swift: Geri arama işlevine tuple iletmeye çalışırken "belirsiz ifade" alma

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) ben Type of expression is ambiguous without more context alıyorum. Herhangi bir fikir?

Bu dersi yazmak için daha iyi, daha Swifty bir yolu var mı?

+0

beyan yanıt izin 'olarak cevap: (res: NSHTTPURLResponse, json: JSON statusCode: httpStatus) = (res: res, json: JSON (json!), statusCode: httpStatus) 'daha fazla bilgi atar mı görmek – gabuh

+0

Tuple üye isimlerini devirmeyi deneyin. – mattt

cevap

6

Derlemenin nedeni, başarı tuple bildirimi etrafında fazladan bir parantez setine sahip olmanızdır. Onları kaldırırsanız, derler. İşlevin güncellenmiş bir sürümü, derlemenin mümkün olduğu kadar az değişiklikle birlikte.

Bir yerde tanımlanmış baseURL olduğundan emin olmanız gerekir.

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) 
      } 
     } 
    } 
} 

İşte kesinlikle temizleyici orijinal işlevinin geliştirilmiş bir şekli olan, ama henüz tamamen güvenli değildir. İyi bir kural, daha fazla ünlem işareti, daha fazla risktir.

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) 
      } 
     } 
    } 
} 

Gerçekten Alamofire.Request sınıfa yerleşik @ mattt müthiş doğrulama mantığı bakmak gerekir. Bu şekilde, HTTPStatus numaralandırma ihtiyacını tamamen kaldırabilirsiniz.

  • 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

Bu çok anlam ifade ediyor! Çok takdir edilen dostum. – Thanos

İlgili konular