2016-11-30 6 views
-2

Я работаю над проектом в Swift 2.3, и я использую структуру AlamoFire и SwiftyJSON для реализации методов вызова веб-сервера.Использование незаявленного типа «JSONDictionary»

Таким образом, я написал класс singleton для вызова этих функций вызова сервера, где бы я ни захотел в своем проекте.

Поэтому, например, после нажатия кнопки входа в систему будет выполняться функция входа в этот класс.

Но когда я построить и запустить проект и после нажатия кнопки Войти сливают сбои приложений, и я получаю вопрос, обозначающее

Использование необъявленной типа «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 let или guard let, чтобы убедиться, что значение не nil

EDIT: Вот что ваш код будет выглядеть следующим образом:

// 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: