2016-11-30 67 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:

相关问题