使用未声明的类型“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 let
或 guard 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 值未定义