Типы быстрых словарей - PullRequest
0 голосов
/ 13 марта 2019

Я схожу с ума от swift, я опытный разработчик Objective C и пытаюсь сделать некоторые базовые вещи в swift, но я схожу с ума по типам и!и?

В следующем примере я просто получаю, где я получаю json, и я хочу преобразовать json ["data"] в типы учетных записей:

Но вКАРТА Я всегда получаю ошибки компиляции из-за недопустимых типов, и когда я смог сделать его компиляцией, я получаю исключение ...

Есть идеи, как мне поступить?

HTTP.GET(url, parameters: [], headers: headers) { response in
    do {
        let json = try JSONSerialization.jsonObject(with: response.data, options: []) as! [String: Any]
        let accountsDict: NSArray = json["data"] as! NSArray;

        let accounts = accountsDict.map { (dict) -> Account in
            let dict2 = dict as! Dictionary<String, String>
            debugPrint(dict);
            return Account(name       : dict2["tenant"]!,
                           geolocation: dict2["geolocation"]!);
        }
        completion(accounts);
    }catch{
        print(error.localizedDescription)
        completion(nil);
    }

}

Ответы [ 3 ]

0 голосов
/ 13 марта 2019

Я бы порекомендовал вам проверить и внедрить AlamoFire , PromiseKit и SwiftyJSON эти 3 библиотеки Swift сделают вашу жизнь очень простой, потому что вы можете выполнять обещанияHTTP-запросов, а затем анализирует ваш JSON в меньшем количестве строк кода, он легче читается и сэкономит вам много времени, вот пример, использующий ваш код в качестве ссылки:

import AlamoFire
import SwiftyJson
import PromiseKit

func DownloadDataAndParseJSON() {

let headers = ["headerParameter": parameter]
let dictionary = [String:String]

Alamofire.request(url, method: .get, headers: headers).responseJSON { response in
    let json = JSON(response.result.value as Any)

    if let items = json.array {
        for item in items{

            let name = item["tenant"].string ?? " "
            let geolocation = item["geolocation"].string ?? " "

            dictionary.updateValue(geolocation, forKey: name)
       }
     }
   }
 }

Посмотрите, как выможет преобразовать проанализированное значение в строку с .string, а также вы можете использовать параметр ??, чтобы добавить необязательное значение по умолчанию в случае, если JSON выдает значение nil, и в случае, если вы хотите использовать определенный тип, напримерв этом сценарии «Учетная запись» вы можете легко добавить его к существующим методам.

0 голосов
/ 14 марта 2019

Хорошо, благодаря комментариям, которые я узнал, как это сделать, использование JSONSerialization было плохой идеей в swift, at - это библиотека Objective-C, и swifts имеет свой собственный JSONDecode, который делает все проще способ

Я боролся с его типами, а также с необходимостью его декодирования в Decodable объект, поэтому я не мог использовать общий массив / dicts, которые мы использовали бы в obj-c, поэтому мне пришлось создать структуру для ответ

struct Pagination :Decodable{
    var data : Array<Account>;
}

, который имеет только переменную данных, которая затем соответствует учетной записи

с этим, POST стал действительно простым

    HTTP.GET(url, parameters: [], headers: headers) { response in
        do {
            let jsonDecoder = JSONDecoder()
            let accounts = try jsonDecoder.decode(Pagination.self, from: response.data)                
            completion(accounts.data);
        }catch{
            print(error.localizedDescription)
            completion(nil);
        }            
    }

Спасибо !!

0 голосов
/ 13 марта 2019

Простыми словами:

? - необязательный параметр, который предотвращает сбой кода при значении nil.

! принудительно развернуть значение, что означает, добавив !, вы убедитесь, что ваша переменная будет иметь значение, и если она равна nil, то ваш код потерпит крах, поэтому не используйте ! в случае, если Вы не уверены в ценности.

Тип:

В Swift 4 [<key-Type>: <value-Type>] - это ваш словарь в формате ключ-значение, а [<object-Type>] - это массив. Например:

    let dictionary: [String: String] = ["name": "Ankit", "Website": "Stack-Overflow"]
    let array: [String] = ["Ankit", "Mike", "Reynolds"]

Вам не нужно применять ; в Swift, и вы можете использовать необязательную проверку с помощью if-let, чтобы проверить, имеет ли ваша переменная значение при анализе ответа JSON, следующим образом:

    HTTP.GET(url, parameters: [], headers: headers) { response in
        do {
            let json = try JSONSerialization.jsonObject(with: response.data, options: []) as? [String: Any]
            var accounts = [Account]()
            if let accountsDict = json?["data"] as? [[String: String]] {
                accounts = accountsDict.map { dict -> Account in
                    return Account(name: dict["tenant"]!, geolocation: dict["geolocation"]!)
                }
            }
            completion(accounts)
        } catch {
            print(error.localizedDescription)
            completion(nil)
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...