我正在使用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)
}
答案 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 let
或guard 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)
}
}