使用未声明的类型“JSONDictionary”

Posted

技术标签:

【中文标题】使用未声明的类型“JSONDictionary”【英文标题】:Use of undeclared type 'JSONDictionary' 【发布时间】:2016-11-30 10:14:11 【问题描述】:

我正在使用 Swift 2.3 开发一个项目,我正在使用 AlamoFire 框架和 SwiftyJSON 来实现我的网络服务器调用方法。

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

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

但是当我构建和运行项目时,一旦点击登录按钮,应用程序就会崩溃,我遇到了一个问题,表明

下面的代码和我遇到问题的行标有注释。

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)


【问题讨论】:

【参考方案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:

【讨论】:

【参考方案2】:

您应该将您从 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)
        
    

【讨论】:

对不起,我是 swift 新手,所以我应该删除哪一行以及将这段代码放在哪里 编辑了我的答案,看看吧。 我没有从 jsonObj 获得成功响应。知道为什么吗? print(jsonObj) 显示什么?您的 JSON 响应是否有“成功”键? Json 响应 : "validation" : "auth" : false , "result" : "message" : "information_error"

以上是关于使用未声明的类型“JSONDictionary”的主要内容,如果未能解决你的问题,请参考以下文章

Typescript 未检测到声明“d.ts”文件中不存在的类型名称的错误

ts-jest - 运行 jest 时从类型 (.d.ts) 中声明 const 值未定义

IOS - - 字典转模型

SSIS 合并声明日期时间未更新

在 Swift 中声明任何类型的数组时使用未声明的类型“T”

未声明绑定变量“D”