Быстрый словарь избегайте хранения пустых словарей в значениях с функциями более высокого порядка

#ios #swift

Вопрос:

Я хочу, чтобы в моем словаре «Продукты» верхнего уровня хранился только непустой словарь вспомогательных продуктов. Есть ли способ написать приведенный ниже код с функциями более высокого порядка, такими как функция сокращения, вместо использования if !subProductDictionary.isEmpty ?

 var productDictionary = [String: Any]() productDictionary["key 1"] = "value 1"  var subProductDictionary = [String: Any]()  if !subProductDictionary.isEmpty {  productDictionary["subProductsKey"] = subProductDictionary }  

*** редактировать

Я хотел бы использовать тот факт, что, когда словари не хранят нулевые значения, поэтому для преобразования subProductDictionary в ноль

Комментарии:

1. Я бы полностью изменил ваши данные, чтобы удалить любые [String: Any] словари. Гораздо лучше моделировать свои данные, используя структуры, которые специально соответствуют вашей модели домена. Таким образом, вы также можете встроить логику, которую пытаетесь добавить, но внутри самой модели.

2. Вы должны использовать класс/структуру, а не [String: Any] хранить свои данные. Почему вы используете a [String: Any] ?

3. Этот вопрос касается кодирования, а не выбора архитектуры.

4. Словари могут хранить нулевые значения. Я бы не рекомендовал этого, но я бы тоже не рекомендовал то, что вы делаете. И, похоже, никто другой тоже не стал бы этого делать.

5. @BlazejSLEBODA Я понимаю, о чем был вопрос. Но, используя хорошо смоделированную структуру данных, вы бы в первую очередь отменили необходимость в функции более высокого порядка для этого. Так что да… вы задали вопрос. Но из всего, что я вижу в вашем коде, это вопрос, который не нужно было задавать, и на самом деле это неправильный вопрос.

Ответ №1:

Я не знаю о функциях более высокого порядка здесь, но это может быть полезно:

 extension Dictionary {  var nonEmpty: Self? {  isEmpty ? nil : self  } }  var things: [String: Any] = [:] let dict: [String: Any] = [:] things["A"] = dict things["B"] = dict.nonEmpty  

Комментарии:

1. Да, с этим я могу написать одну строчку. 1

Ответ №2:

Возможное решение:

 var productDictionary = [String: Any]() productDictionary["key 1"] = "value 1"  var subProductDictionary = [String: Any]()  if !subProductDictionary.isEmpty {  productDictionary["subProductsKey"] = subProductDictionary }  *** "Optional with flatMap" instead "if"  productDictionary["subProductsKey"] = Optional(subProductDictionary).flatMap { $0.count == 0 ? nil : $0 }