Мне кажется, что ответ здесь должен быть очевиден, и я должен сам разобраться в этом, но после целого дня борьбы я думаю, что имеет смысл попросить о помощи. У меня есть массив структур, который я создал, сначала декодировав файл данных JSON, а затем отфильтровав часть его элементов в свою собственную модель. Мне нужно реорганизовать данные, чтобы я мог использовать их для заполнения 3 связанных средств выбора, где пользователь выберет определенные c параметры поиска.
Моя модель выглядит так:
struct Brand: Hashable, Comparable {
static func == (lhs: Brand, rhs: Brand) -> Bool {
return lhs.name == rhs.name && lhs.models == rhs.models
}
static func <(lhs: Brand, rhs: Brand) -> Bool {
return lhs.name < rhs.name
}
var name: String
var models: [Model]
init(name:String, models:[Model]) {
self.name = name
self.models = models
}
}
struct Model: Hashable, Comparable {
static func == (lhs: Model, rhs: Model) -> Bool {
return lhs.name == rhs.name && lhs.years == rhs.years
}
static func <(lhs: Model, rhs: Model) -> Bool {
return lhs.name < rhs.name
}
var name: String
var years: [String]
init(name:String, years:[String]) {
self.name = name
self.years = years
}
}
После передачи данных из JSON и выполнения некоторой реорганизации (т.е. удаления дубликатов) у меня теперь есть массив от 50 до 100 структур. В настоящее время несколько структур повторяют один и тот же бренд, а затем имеют ОДНУ отдельную модель. Мне нужно реорганизовать его так, чтобы каждая структура имела только ОДИН бренд, но внутри нее был массив моделей. Очевидно, что структура данных настроена для этого. Вот как сейчас выглядят данные (из дампа консоли):
▿ 5 elements
▿ PickerTesting.Brand
- name: "Cannondale"
▿ models: 1 element
▿ PickerTesting.Model
- name: "SystemSix Carb"
▿ years: 1 element
- "2020"
▿ PickerTesting.Brand
- name: "Cannondale"
▿ models: 1 element
▿ PickerTesting.Model
- name: "SuperX Wmn\'s"
▿ years: 1 element
- "2020"
▿ PickerTesting.Brand
- name: "Cannondale"
▿ models: 1 element
▿ PickerTesting.Model
- name: "Synapse Carb"
▿ years: 1 element
- “2020"
PickerTesting.Brand
- name: "Pinarello"
▿ models: 1 element
▿ PickerTesting.Model
- name: "Razha"
▿ years: 1 element
- "2021"
▿ PickerTesting.Brand
- name: "Pinarello"
▿ models: 1 element
▿ PickerTesting.Model
- name: "Angliru"
▿ years: 1 element
- "2021"
И мне НЕОБХОДИМО ПОЛУЧИТЬ ЭТО, ЧТОБЫ ВЫГЛЯДИТЬ:
▿ 2 elements
▿ PickerTesting.Brand
- name: "Cannondale"
▿ models: 3 element
▿ PickerTesting.Model
- name: "SystemSix Carb”, “SuperX Wmn”, “Synapse Carb"
▿ years: 1 element
- “2020"
PickerTesting.Brand
- name: "Pinarello"
▿ models: 2 element
▿ PickerTesting.Model
- name: “Razha”, “Angliru"
▿ years: 1 element
- "2021"
Я работал, чтобы попробовать до l oop через элементы с той же торговой маркой, скопируйте модели (и, следовательно, годы) в пустой массив, а затем в конце повторяющихся торговых марок добавьте модели к единой торговой марке. Этот logi c по-прежнему кажется мне правильным, и я смог объединить несколько моделей под одним брендом. Но мой код представляет собой абсолютный беспорядок: то, что у меня есть, продолжает повторяться для одних и тех же брендов и создавать повторяющиеся структуры с несколькими моделями. Что еще хуже, мое ранее успешное использование Array (Set (Data)) для удаления дубликатов не удалось. Вот моя текущая функция, которую я стесняюсь здесь показывать - но в интересах обучения. Счетчик явно неправильный, но моя попытка использовать для индекса в циклах диапазона привела либо к бесконечным циклам, либо к выводу десятков тысяч элементов. Я все еще не уверен, почему значение счетчика всего 10 даст ТАК МНОГО результатов, но результаты никогда не выходят за рамки первых двух брендов (их около 10); вместо этого они просто продолжают повторять результаты. Примечание: в приведенном ниже коде uglyData, взятый в качестве аргумента этой функции, является моим текущим массивом структур, как описано выше.
Прошу прощения, что это не более лаконично, благодарен за любые указания . Повторяю, я чувствую, что это не должно быть слишком сложно, но я нахожусь на краю. время через. Вероятно, лучшим решением будет написать одну функцию в go из JSON в нужную мне форму. Я работаю над этим сейчас, но не обязательно близок к успеху.
func getBrandsAll() -> [Brand] {
var brands: [Brand] = []
let allFrames = frameData
for i in 0..<allFrames.count {
brands.append(Brand(name: allFrames[i].brand, models:
[Model(name: allFrames[i].model, years: [allFrames[i].year.description])]))
}
let unique = Array(Set(brands))
let sorted = unique.sorted()
return sorted
}