2016-11-30 68 views
-2

我工作的一個項目,雨燕2.3和我使用的是AlamoFire框架和SwiftyJSON爲實現我的網絡服務器調用方法。使用未聲明的類型「JSONDictionary」

因此我寫了一個單獨的類來調用這些服務器調用函數的地方我想在我的項目。

因此例如一旦登錄按鈕被點擊在這個類將執行登錄功能。

但是當我建立並運行該項目,一旦登錄按鈕被點擊應用程序崩潰和我越來越表示

使用未聲明的類型「JSONDictionary」的問題。

下面的代碼和我遇到的問題行標有註釋。

import UIKit 
import Alamofire 
import SwiftyJSON 

struct Singleton { 
    static let instance : APIManager = APIManager() 
} 


public class APIManager: NSObject { 

    var appURLs = AppURLs.sharedInstance 



    public class var sharedInstance: APIManager { 
    return Singleton.instance 
    } 

    let manager = Manager() 

    override init() { 

    } 
func login(username: String, password: String, completion: (user: User, success: Bool) ->(), failed:(error: NSError) ->()) -> Request { 

    let baseURL = NSURL(string: appURLs.mainBaseURL); 
let urlRequest = NSURLRequest(URL: baseURL!.URLByAppendingPathComponent(appURLs.loginURL)!) 
return manager.request(urlRequest) 

     .validate() 
     .responseJSON { response in 
     if let error = response.result.error { 
      failed(error: error) 
      print(error) 
      return; 
     } 
     print("working up to here") 
     let ok = ((response.result.value as! JSONDictionary)["success"] as? Bool)!//This is where I get the issue 
     if ok { 
     let userJson = JSON((response.result.value as! JSONDictionary)["user"]!) 

     let token = ((response.result.value as! JSONDictionary)["token"] as? String)! 
     NSUserDefaults.standardUserDefaults().setValue(token, forKey: "TOKEN") 
     NSUserDefaults.standardUserDefaults().synchronize() 
     //let user = user(json: userJson) 
     let user = User() 
     user.displayName = userJson ["displayName"].string 
     print("displayName is :", user.displayName) 

     completion(user: user,success: ok) 

} 

回答

0

你要拋棄你從Alamofire到Dictionary[String: AnyObject]什麼。

下面是一個示例代碼來處理響應值你:

// You can add "as? [String:AnyObject]" to the if let statement if you prefer. 
if let jsonResult = response.result.value { // jsonResult is of type [String: AnyObject] 
    let jsonObj = JSON(jsonResult) 

    print(jsonObj) 
} 

然後從你的jsonObj,你可以這樣做jsonObj["user"]["token"].string檢索令牌(不要忘記保護這個調用與if letguard let以確保該值不nil

編輯:這是你的代碼是什麼樣子:

// you need to change the keys to what the API expect 
return manager.request(.POST, urlRequest, parameters: ["userName": username, "password": password], encoding: .JSON) 

    .validate() 
    .responseJSON { response in 
    if let error = response.result.error { 
     failed(error: error) 
     print(error) 
     return; 
    } 
    print("working up to here") 
    if let jsonResult = response.result.value { 
     let jsonObj = JSON(jsonResult) 

     print(jsonObj) 
     let ok = jsonObj["success"].bool // or boolValue 

     if ok != false { 
      if let token = jsonObj["user"]["token"].string { 
       NSUserDefaults.standardUserDefaults().setObject(token, forKey: "TOKEN") 
       NSUserDefaults.standardUserDefaults().synchronize() 
      } 

      let user = User() 
      user.displayName = jsonObj["user"]["displayName"].string 
      print("displayName is :", user.displayName) 

      completion(user: user,success: ok) 
     } 
    } 
+0

對不起,即時通訊新的迅速,所以我應該擺脫哪一行,以及在哪裏放置此代碼 – danu

+0

編輯我的答案,檢查出來。 – Jeremy

+0

我沒有從jsonObj獲得成功響應。任何想法爲什麼是這樣? – danu

1

這裏只有一個類型別名缺少

typealias JSONDictionary = [String:AnyObject] // Swift 3: [String:Any] 

放線的APIManager


你還可以用替代

struct Singleton { 
    static let instance : APIManager = APIManager() 
} 


public class APIManager: NSObject { 

    var appURLs = AppURLs.sharedInstance 

    public class var sharedInstance: APIManager { 
    return Singleton.instance 
    } 
... 

public class APIManager: NSObject { 

    var appURLs = AppURLs.sharedInstance 
    static let sharedInstance = APIManager() 
... 

Singleton東西已經過時,不再需要了。


PS:不要使用setValue:forKey:保存在用戶的默認值的對象。正確的方法是setObject:forKey:

相關問題