Быстрые переменные JSON со всеми числовыми именами.Какая работа вокруг? - PullRequest
0 голосов
/ 24 сентября 2018

Я извлекаю некоторые данные JSON, которые мне нужно проанализировать с помощью Decodable, в Swift.

Поскольку большая часть данных представляет собой даты, у меня есть 365 записей дат по строкам:

"20170101": 0.17, 
"20170102": 1.0, 
"20170103": 0.68, 
"20170104": 0.61, 
"20170105": 1.03, 
"20170106": 0.48, 
"20170107": 0.52, 
"20170108": 0.51, 
"20170109": 0.28, 

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

var 20170101: Double

Какой и есть обходной путь для получения числового имени

Ответы [ 3 ]

0 голосов
/ 24 сентября 2018

Вы можете проанализировать ваш словарь json как [String:Double], и они преобразуют его в массив кортежей даты и удваивают:

let json = """
{
"20170101": 0.17,
"20170102": 1.0,
"20170103": 0.68,
"20170104": 0.61,
"20170105": 1.03,
"20170106": 0.48,
"20170107": 0.52,
"20170108": 0.51,
"20170109": 0.28
}
"""

let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyyMMdd"
dateFormatter.locale = Locale(identifier: "en_US_POSIX")  

do {
    let array: [(date: Date, double: Double)] = try JSONDecoder().decode([String:Double].self, from: Data(json.utf8))
        .compactMap({ (key,value) -> (Date, Double)? in
        guard let date = dateFormatter.date(from: key) else { return nil }
        return (date, value)
    }).sorted(by: { $0.date < $1.date })
    for (date, double) in array {
        print("Date:", dateFormatter.string(for: date)!, "• Value:", double)
    }
} catch {
    print(error)
}

Дата: 20170101 • Значение: 0,17

Дата: 20170102 • Значение: 1,0

Дата: 20170103 • Значение: 0,68

Дата: 20170104 • Значение: 0,61

Дата: 20170105 • Значение: 1,03

Дата: 20170106 • Значение: 0,48

Дата: 20170107 • Значение: 0,52

Дата: 20170108 • Значение:0,51

Дата: 20170109 • Значение: 0,28

0 голосов
/ 24 сентября 2018

Сейчас у меня нет времени, чтобы сделать закодированный ответ, но в то же время вы можете попытаться проанализировать ваш словарь как [Date:Double в инициализаторе и установить

decoder.dateDecodingStrategy

в вашем JSONDecoder.Я не уверен, будет ли dateDecodingStrategy применяться к ключам, но, похоже, стоит попробовать.Проверьте этот пост для более подробной информации о том, как сделать dateDecodingStrategy.

0 голосов
/ 24 сентября 2018

Имена переменных не могут начинаться с цифры (хотя вы можете использовать цифры позже в имени).Они должны начинаться с буквы или символа подчеркивания _:

var _20170101: Double
var d20170101: Double
var d_20170101: Double

В Swift (как и в других языках) имена переменных не могут содержать пробельные символы, математические символы (такие как плюс (+) или минус (-) операторы) или определенные значения Unicode или строка и символы рисования прямоугольника . Основная причина этого заключается в том, чтобы гарантировать, что компилятор Swift сможет понять, где имена наших переменных начинаются и где они заканчиваются.

Кроме этого, при именовании переменной:

  • Стремитесь к ясности

  • Приоритет ясности по сравнению с краткостью

  • Называйте переменные, параметры и связанные с ними типы в соответствии с их ролями

Для получения более подробной информации о соглашениях по присвоению имен см. здесь .

...