#ios #arrays #json #swift #dictionary
#iOS #массивы #json #swift #словарь
Вопрос:
Мне нужна ваша помощь, чтобы проанализировать ответ, поступающий из API, и обновить раздел таблицы и строку на основе предпочтения порядка «колоды» ключей.
Прямо сейчас я создаю словарь значений ключа, группируя аналогичный тип «колоды», но после группировки последовательности колод, поступающей из ответа, изменяется, что приводит к неупорядоченному словарю.
Вот мой код:
func hitGetDVLData(dataDict: NSDictionary) {
APIsHandler.getDVLVideos(postData: dataDict) { (result, response, error, errorMessage) in
if let responseData = response {
if( error == nil amp;amp; (responseData["status"] as AnyObject) as? Bool ?? false){
if let responseData1 = responseData["data"] as? NSDictionary {
self.courseDataDict = responseData1 as! [String : Any]
if let topics = (responseData1["curriculam"] as? NSDictionary)?.value(forKey: "topics") as? [[String : Any]] {
// attached output below
self.totalArrayCount = topics.count
let crossReference = Dictionary(grouping: topics, by: { $0["deck"] as! String })
self.premimumVideoArray = [:]
self.premimumVideoArray = crossReference
// attached output below
}
self.tableviewHeightConstraint.constant = self.tableViewHeight
self.tableView.reloadData()
}
}
}
}
}
Где courseDataDict amp; premimumVideoArray — это переменная, определяемая следующим образом
var courseDataDict: [String : Any] = [:]
var premimumVideoArray : [String : [[String:Any]]] = [:]
ВЫВОД:
ответ:
{
data = {
"course_type" = 4;
"cover_image" = "https://dams-apps-production.s3.ap-south-1.amazonaws.com/course_file_meta/8fa5367315f2b063d45c165095d5f4f4";
"cover_video" = "";
curriculam = {
title = "";
topics = (
{
completed = "";
deck = Preclinicals;
"sub_img_url" = "http://d1wspjxps4juxd.cloudfront.net/course_file_meta/1513449anatomy.png";
title = Anatomy;
"topic_id" = 2243;
total = 47;
},
{
completed = "";
deck = Preclinicals;
"sub_img_url" = "http://d1wspjxps4juxd.cloudfront.net/course_file_meta/1524143physiology.png";
title = Physiology;
"topic_id" = 2421;
total = 59;
},
{
completed = "";
deck = Preclinicals;
"sub_img_url" = "http://d1wspjxps4juxd.cloudfront.net/course_file_meta/3658439biochemistry.png";
title = Biochemistry;
"topic_id" = 2245;
total = 35;
},
{
completed = "";
deck = Paraclinicals;
"sub_img_url" = "http://d1wspjxps4juxd.cloudfront.net/course_file_meta/5903031pathalogy.png";
title = Pathology;
"topic_id" = 2419;
total = 97;
},
{
completed = "";
deck = Paraclinicals;
"sub_img_url" = "http://d1wspjxps4juxd.cloudfront.net/course_file_meta/7011603pharmocology.png";
title = Pharmacology;
"topic_id" = 2412;
total = 95;
},
{
completed = "";
deck = Paraclinicals;
"sub_img_url" = "http://d1wspjxps4juxd.cloudfront.net/course_file_meta/5728715microbilogy.png";
title = Microbiology;
"topic_id" = 2411;
total = 90;
},
{
completed = "";
deck = Paraclinicals;
"sub_img_url" = "http://d1wspjxps4juxd.cloudfront.net/course_file_meta/5468554forensic.png";
title = FMT;
"topic_id" = 2416;
total = 8;
},
{
completed = "";
deck = "Clinicals (Prefinals)";
"sub_img_url" = "http://d1wspjxps4juxd.cloudfront.net/course_file_meta/6417172ophthalmology.png";
title = Ophthalmology;
"topic_id" = 2418;
total = 51;
},
{
completed = "";
deck = "Clinicals (Prefinals)";
"sub_img_url" = "http://d1wspjxps4juxd.cloudfront.net/course_file_meta/1909654ent.png";
title = ENT;
"topic_id" = 2420;
total = 62;
},
{
completed = "";
deck = "Clinicals (Prefinals)";
"sub_img_url" = "http://d1wspjxps4juxd.cloudfront.net/course_file_meta/5293280community_medicine.png";
title = PSM;
"topic_id" = 2409;
total = 26;
},
{
completed = "";
deck = Clinicals;
"sub_img_url" = "http://d1wspjxps4juxd.cloudfront.net/course_file_meta/5520806medicine.png";
title = Medicine;
"topic_id" = 2637;
total = 137;
},
{
completed = "";
deck = Clinicals;
"sub_img_url" = "http://d1wspjxps4juxd.cloudfront.net/course_file_meta/5084703surgery.png";
title = Surgery;
"topic_id" = 2638;
total = 83;
},
{
completed = "";
deck = Clinicals;
"sub_img_url" = "";
title = "Obgamp;Gy";
"topic_id" = 2423;
total = 41;
},
{
completed = "";
deck = Clinicals;
"sub_img_url" = "";
title = Paediatrics;
"topic_id" = 2246;
total = 27;
},
{
completed = "";
deck = SARPO;
"sub_img_url" = "http://d1wspjxps4juxd.cloudfront.net/course_file_meta/462645dermatology.png";
title = Dermatology;
"topic_id" = 2415;
total = 27;
},
{
completed = "";
deck = SARPO;
"sub_img_url" = "http://d1wspjxps4juxd.cloudfront.net/course_file_meta/7845414anesthysia.png";
title = Anesthesia;
"topic_id" = 2639;
total = 22;
},
{
completed = "";
deck = SARPO;
"sub_img_url" = "http://d1wspjxps4juxd.cloudfront.net/course_file_meta/5468718radiology.png";
title = Radiology;
"topic_id" = 2406;
total = 31;
},
{
completed = "";
deck = SARPO;
"sub_img_url" = "http://d1wspjxps4juxd.cloudfront.net/course_file_meta/2301599psychiatry.png";
title = Psychiatry;
"topic_id" = 2410;
total = 26;
},
{
completed = "";
deck = SARPO;
"sub_img_url" = "http://d1wspjxps4juxd.cloudfront.net/course_file_meta/2994784orthopendics.png";
title = Orthopaedics;
"topic_id" = 2414;
total = 35;
}
);
};
"desc_header_image" = "https://dams-apps-production.s3.ap-south-1.amazonaws.com/course_file_meta/7661839dvl.png";
"for_dams" = 80000;
"free_ids" = "78295,28,59809,176600,231590,164118,181331,230458,3066";
gst = 18;
"gst_include" = 1;
id = 451;
"is_purchased" = 1;
"is_validity" = 0;
learner = 21;
mrp = 0;
"non_dams" = 80000;
"points_conversion_rate" = 100;
rating = "0.0";
"review_count" = 0;
title = DVL;
validity = 0;
};
error = (
);
"is_ios_price" = 1;
message = "Course information.";
status = 1;
}
Темы:
[["title": Anatomy, "sub_img_url": http://d1wspjxps4juxd.cloudfront.net/course_file_meta/1513449anatomy.png, "completed": , "topic_id": 2243, "deck": Preclinicals, "total": 47], ["total": 59, "title": Physiology, "sub_img_url": http://d1wspjxps4juxd.cloudfront.net/course_file_meta/1524143physiology.png, "completed": , "topic_id": 2421, "deck": Preclinicals], ["total": 35, "deck": Preclinicals, "completed": , "title": Biochemistry, "sub_img_url": http://d1wspjxps4juxd.cloudfront.net/course_file_meta/3658439biochemistry.png, "topic_id": 2245], ["total": 97, "title": Pathology, "completed": , "topic_id": 2419, "sub_img_url": http://d1wspjxps4juxd.cloudfront.net/course_file_meta/5903031pathalogy.png, "deck": Paraclinicals], ["topic_id": 2412, "total": 95, "sub_img_url": http://d1wspjxps4juxd.cloudfront.net/course_file_meta/7011603pharmocology.png, "completed": , "title": Pharmacology, "deck": Paraclinicals], ["deck": Paraclinicals, "total": 90, "completed": , "title": Microbiology, "topic_id": 2411, "sub_img_url": http://d1wspjxps4juxd.cloudfront.net/course_file_meta/5728715microbilogy.png], ["sub_img_url": http://d1wspjxps4juxd.cloudfront.net/course_file_meta/5468554forensic.png, "deck": Paraclinicals, "total": 8, "title": FMT, "completed": , "topic_id": 2416], ["topic_id": 2418, "deck": Clinicals (Prefinals), "sub_img_url": http://d1wspjxps4juxd.cloudfront.net/course_file_meta/6417172ophthalmology.png, "title": Ophthalmology, "total": 51, "completed": ], ["title": ENT, "total": 62, "sub_img_url": http://d1wspjxps4juxd.cloudfront.net/course_file_meta/1909654ent.png, "topic_id": 2420, "completed": , "deck": Clinicals (Prefinals)], ["deck": Clinicals (Prefinals), "total": 26, "completed": , "topic_id": 2409, "sub_img_url": http://d1wspjxps4juxd.cloudfront.net/course_file_meta/5293280community_medicine.png, "title": PSM], ["title": Medicine, "sub_img_url": http://d1wspjxps4juxd.cloudfront.net/course_file_meta/5520806medicine.png, "topic_id": 2637, "total": 137, "deck": Clinicals, "completed": ], ["title": Surgery, "deck": Clinicals, "topic_id": 2638, "total": 83, "completed": , "sub_img_url": http://d1wspjxps4juxd.cloudfront.net/course_file_meta/5084703surgery.png], ["topic_id": 2423, "sub_img_url": , "deck": Clinicals, "title": Obgamp;Gy, "completed": , "total": 41], ["sub_img_url": , "topic_id": 2246, "title": Paediatrics, "deck": Clinicals, "completed": , "total": 27], ["title": Dermatology, "completed": , "deck": SARPO, "total": 27, "topic_id": 2415, "sub_img_url": http://d1wspjxps4juxd.cloudfront.net/course_file_meta/462645dermatology.png], ["deck": SARPO, "total": 22, "sub_img_url": http://d1wspjxps4juxd.cloudfront.net/course_file_meta/7845414anesthysia.png, "completed": , "title": Anesthesia, "topic_id": 2639], ["topic_id": 2406, "total": 31, "title": Radiology, "deck": SARPO, "sub_img_url": http://d1wspjxps4juxd.cloudfront.net/course_file_meta/5468718radiology.png, "completed": ], ["title": Psychiatry, "total": 26, "topic_id": 2410, "deck": SARPO, "sub_img_url": http://d1wspjxps4juxd.cloudfront.net/course_file_meta/2301599psychiatry.png, "completed": ], ["deck": SARPO, "completed": , "topic_id": 2414, "sub_img_url": http://d1wspjxps4juxd.cloudfront.net/course_file_meta/2994784orthopendics.png, "title": Orthopaedics, "total": 35]]
Перекрестная ссылка:
["Paraclinicals": [["total": 97, "title": Pathology, "completed": , "topic_id": 2419, "sub_img_url": http://d1wspjxps4juxd.cloudfront.net/course_file_meta/5903031pathalogy.png, "deck": Paraclinicals], ["topic_id": 2412, "total": 95, "sub_img_url": http://d1wspjxps4juxd.cloudfront.net/course_file_meta/7011603pharmocology.png, "completed": , "title": Pharmacology, "deck": Paraclinicals], ["deck": Paraclinicals, "total": 90, "completed": , "title": Microbiology, "topic_id": 2411, "sub_img_url": http://d1wspjxps4juxd.cloudfront.net/course_file_meta/5728715microbilogy.png], ["sub_img_url": http://d1wspjxps4juxd.cloudfront.net/course_file_meta/5468554forensic.png, "deck": Paraclinicals, "total": 8, "title": FMT, "completed": , "topic_id": 2416]], "Clinicals (Prefinals)": [["topic_id": 2418, "deck": Clinicals (Prefinals), "sub_img_url": http://d1wspjxps4juxd.cloudfront.net/course_file_meta/6417172ophthalmology.png, "title": Ophthalmology, "total": 51, "completed": ], ["title": ENT, "total": 62, "sub_img_url": http://d1wspjxps4juxd.cloudfront.net/course_file_meta/1909654ent.png, "topic_id": 2420, "completed": , "deck": Clinicals (Prefinals)], ["deck": Clinicals (Prefinals), "total": 26, "completed": , "topic_id": 2409, "sub_img_url": http://d1wspjxps4juxd.cloudfront.net/course_file_meta/5293280community_medicine.png, "title": PSM]], "SARPO": [["title": Dermatology, "completed": , "deck": SARPO, "total": 27, "topic_id": 2415, "sub_img_url": http://d1wspjxps4juxd.cloudfront.net/course_file_meta/462645dermatology.png], ["deck": SARPO, "total": 22, "sub_img_url": http://d1wspjxps4juxd.cloudfront.net/course_file_meta/7845414anesthysia.png, "completed": , "title": Anesthesia, "topic_id": 2639], ["topic_id": 2406, "total": 31, "title": Radiology, "deck": SARPO, "sub_img_url": http://d1wspjxps4juxd.cloudfront.net/course_file_meta/5468718radiology.png, "completed": ], ["title": Psychiatry, "total": 26, "topic_id": 2410, "deck": SARPO, "sub_img_url": http://d1wspjxps4juxd.cloudfront.net/course_file_meta/2301599psychiatry.png, "completed": ], ["deck": SARPO, "completed": , "topic_id": 2414, "sub_img_url": http://d1wspjxps4juxd.cloudfront.net/course_file_meta/2994784orthopendics.png, "title": Orthopaedics, "total": 35]], "Clinicals": [["title": Medicine, "sub_img_url": http://d1wspjxps4juxd.cloudfront.net/course_file_meta/5520806medicine.png, "topic_id": 2637, "total": 137, "deck": Clinicals, "completed": ], ["title": Surgery, "deck": Clinicals, "topic_id": 2638, "total": 83, "completed": , "sub_img_url": http://d1wspjxps4juxd.cloudfront.net/course_file_meta/5084703surgery.png], ["topic_id": 2423, "sub_img_url": , "deck": Clinicals, "title": Obgamp;Gy, "completed": , "total": 41], ["sub_img_url": , "topic_id": 2246, "title": Paediatrics, "deck": Clinicals, "completed": , "total": 27]], "Preclinicals": [["title": Anatomy, "sub_img_url": http://d1wspjxps4juxd.cloudfront.net/course_file_meta/1513449anatomy.png, "completed": , "topic_id": 2243, "deck": Preclinicals, "total": 47], ["total": 59, "title": Physiology, "sub_img_url": http://d1wspjxps4juxd.cloudfront.net/course_file_meta/1524143physiology.png, "completed": , "topic_id": 2421, "deck": Preclinicals], ["total": 35, "deck": Preclinicals, "completed": , "title": Biochemistry, "sub_img_url": http://d1wspjxps4juxd.cloudfront.net/course_file_meta/3658439biochemistry.png, "topic_id": 2245]]]
Скриншоты:
Любой способ, как получить эти данные, чтобы моя последовательность группировки была в виде
[«Доклинические», «Параклинические», «Клинические (предварительные)», «Клинические», «SARPO»].
т.е. 1-й раздел — доклинические исследования и там строки, 2-й раздел — параклинические исследования и там строки, и так далее.
Заранее спасибо.
Комментарии:
1. Словари по определению неупорядочены.
2. Сократите свой вопрос и удалите ненужную информацию. Мне кажется, что у вас уже есть ответ, используйте массив, который вы указали в конце, и выполните цикл по нему и получите значения из вашего словаря в этом порядке.
3. @JoakimDanielson Но как??
4. @Magnas да, но как мне это нужно в отсортированном виде.
Ответ №1:
Я бы посоветовал вам изучить и использовать Codable
вместо этого для вашего декодирования json и работы со структурами, чтобы ваш код был понятнее и с ним было проще работать.
Предполагая, что вы это сделаете, и у вас будет пользовательский тип, подобный приведенному ниже (то, что вы опубликовали, не соответствует json, поэтому я сделал некоторые предположения)
struct Topic: Decodable {
let topicId: Int
let completed: String
let deck: String
let subImageUrl: String
let title: String
let total: Int
enum CodingKeys: String, CodingKey {
case topicId = "topic_id"
case subImageUrl = "sub_img_url"
case completed, deck, title, total
}
}
Затем мы можем обернуть эту структуру в другой пользовательский тип, который соответствует вашим требованиям пользовательского интерфейса, с именем deck (я называю их здесь section) и массивом тем
struct TopicSection {
let section: String
let topics: [Topic]
}
Итак, если у вас есть все ваши разделы из json в массиве topics
, вы можете затем создать массив этой новой структуры, где содержимое поступает в порядке, указанном в вашем массиве названий разделов.
let sectionNames = ["Preclinicals", "Paraclinicals", "Clinicals (Prefinals)", "Clinicals", "SARPO"]
var sections = [TopicSection]()
sectionNames.forEach { name in
let section = TopicSection(section: name, topics: topics.filter { $0.deck == name})
sections.append(section)
}
И затем вы можете использовать sections
массив в качестве источника для вашего табличного представления. Конечно, TopicSection
также можно было бы использовать даже без использования Codable
, изменив тип topics
на словарь, [String: Any]
Комментарии:
1. Спасибо за это, но мои названия разделов являются динамическими.
2. @SatishThakur Тогда как вы определяете порядок сортировки?
3. @SatishThakur есть какие-нибудь отзывы по этому поводу?