iOS swift - работа с ответом от API - PullRequest
0 голосов
/ 22 ноября 2018

Я очень новичок в разработке Swift и iOS.И мне интересно, как сделать что-то относительно простое, если бы я использовал JavaScript.

Я звоню в API, который возвращает следующее.Извините за форматирование, но оно напрямую скопировано с консоли Xcode.

["type": success, "value": <__NSArrayI 0x600000030340>(
       {
          categories = ();
          id = 155;
          joke = "Chuck Norris does not &quot;style&quot; his hair. It lays perfectly in place out of sheer terror.";
       },
       {
            categories = (nerdy);
            id = 69;
            joke = "Scientists have estimated that the energy given off during the Big Bang is roughly equal to 1CNRhK (Chuck Norris Roundhouse Kick).";
       }
    )
]

Я хочу перебрать ответ и добавить в массив.В JavaScript это будет выглядеть следующим образом:

let jokes = [];
response.value.forEach(item => {
   jokes.push(item.joke)
})

Это не обязательно должно быть точно так же, как указано выше.Я уверен, что использую циклы в swift и добавляю в массив.Я пытаюсь получить доступ к анекдотам в массиве value, возвращенном из API.

Мой контроллер выглядит следующим образом:

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        let url = URL(string: "http://api.icndb.com/jokes/random/2")
        URLSession.shared.dataTask(with:url!, completionHandler: {(data, response, error) in
            guard let data = data, error == nil else { return }
            do {
                let json = try JSONSerialization.jsonObject(with: data, options: .allowFragments) as! [String:Any]
                print(json["value"])
                // not sure how to access each joke in the array here
            } catch let error as NSError {
                print(error)
            }
        }).resume()
    }
}

Ответы [ 2 ]

0 голосов
/ 22 ноября 2018

Как вы можете видеть из журналов, переменная json ["value"] имеет тип NSArray, поэтому вы можете сделать что-то подобное, чтобы получить ваши данные (есть так много способов сделать это).

Сначалаиз всего, что вы можете создать объект Шутка, которую вы хотите взять, как это

class Joke: NSObject {
     var categories = [String]()
     var id: Int?
     var joke: String?

     init(json: [String: Any]) {
         if let categories = json["categories"] as? String {
             for category in categories {
                 self.categories.append(category)
             }
         }
         if let id = json["id"] as? Int {
             self.id = id
         }
         if let joke = json[""] as? String {
             self.joke = joke
         }
     }
}

И затем вы делаете это в вашем ViewController

class ViewController: UIViewController {


    var jokes = [Joke]()

    override func viewDidLoad() {
        super.viewDidLoad()

        let url = URL(string: "http://api.icndb.com/jokes/random/2")
        URLSession.shared.dataTask(with:url!, completionHandler: {(data, response, error) in
            guard let data = data, error == nil else { return }
            do {
                let json = try JSONSerialization.jsonObject(with: data, options: .allowFragments) as! [String:Any]
                print(json["value"])
                // not sure how to access each joke in the array here
                let arrayOfObject = json["value"] as! NSArray
                for object in arrayOfObject {
                    if let json = object as? [String: Any] {
                        let object = Joke(json: json)
                        // Now you have your object containing the data from the JSON and you can insert it in your array of Object
                        jokes.append(object)
                    }
                }
            } catch let error as NSError {
                print(error)
            }
        }).resume()
    }
}

Помните, что есть много способов сделать это,Я показал вам простой способ сделать это, надеюсь, это будет полезно.

0 голосов
/ 22 ноября 2018

Вы можете попробовать

if let va = json["value"] as? [[String:Any]] {
   va.forEach { print($0["joke"]) }
}

Я бы предпочел написать Codable структуры для этого

struct Root: Codable {
    let type: String
    let value: [Value]
}

struct Value: Codable {
    let categories: [Category]
    let id: Int
    let joke: String
}

struct Category: Codable {
}

let res = try? JSONDecoder().decode(Root.self,from:data)
print(res.value)
...