使用未声明的类型' JSONDictionary'

时间:2016-11-30 10:14:11

标签: ios swift alamofire

我正在使用Swift 2.3中的一个项目,我使用AlamoFire框架和SwiftyJSON来实现我的webserver调用方法。

因此,我编写了一个单例类,以便在项目中的任何地方调用这些服务器调用函数。

因此,例如,一旦点击登录按钮,将执行该类中的登录功能。

但是当我构建并运行项目时,一旦点击登录按钮,应用程序崩溃,我就会出现问题

  

使用未声明的类型' 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)

}

2 个答案:

答案 0 :(得分: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:

答案 1 :(得分: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来保护此来电,以确保该值不是't 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)
        }
    }