Преобразование вложенного словаря для создания строки Swift

#ios #swift #string #dictionary

#iOS #swift #строка #словарь

Вопрос:

У меня есть словарь, который содержит ключ и модель элементов для значений.

var selectedDic: [String: [Item]] = [:]

  • На самом деле я пытаюсь создать строку с ключом словаря, а ключ имеет несколько значений, разделенных запятой.
  • И если я добавлю больше значений к ключу, он должен добавить значения к определенному ключу.
  • price и publisher являются ключами и itemId значением.

Мне нужна эта строка: price:10-25;publisher:576,925,1737

Печать словаря:

 [
  "price": [
    Babil.Item(name: Optional("10 - 25"),
    itemId: Optional("10-25"))
  ],
  "publisher": [
    Babil.Item(name: Optional("ABCD"),
    itemId: Optional("576")),
    Babil.Item(name: Optional("DEFG"),
    itemId: Optional("925")),
    Babil.Item(name: Optional("HIJK"),
    itemId: Optional("1737"),
    )
  ]
]
 

Мой код:

  var itemString: [String: String] = [:]
 var str: [String] = []
        
   for (key, value) in selectedDic {
            value.forEach { a in
                if str.firstIndex(of: key) == nil {
                    str.append(a.itemId!)
                }
            }
            
            let final = str.joined(separator: ",")
            itemString.updateValue(final, forKey: key)
            
        }
 

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

1. let priceStr = itemString["price"]?.compactMap{ $0.name }.joined(separator: ","); let publisherStr = itemString["publisher"]?.compactMap{ $0.itemId } .joined(separator:","); let finalStr = [priceStr, publisherStr].compactMap{ $0 }.joined(separator: ";") или что-то в этом роде? Но было бы полезно узнать, какова ваша текущая производительность, может ли быть более одной цены? Зачем использовать Dict, а не другую пользовательскую структуру? Почему name И itemId ТО , И ДРУГОЕ является необязательным Item ? Разве это нормально?

2. @Larme Прежде всего благодарю вас. Но перед созданием строки он дублирует значение и для других ключей. смотрите — ["price": "10-25", "publisher": "10-25,576,925,1737"] 10-25 в издателе тоже.

Ответ №1:

С:

 struct Item {
    let name: String?
    let itemId: String?
}

let dict: [String: [Item]] = ["price": [Item(name: "10-25", itemId: "10-25")],
                              "publisher": [Item(name: "ABCD", itemId: "576"),
                                            Item(name: "DEFG", itemId: "925"),
                                            Item(name: "HIJK", itemId: "1737")]]


 

Вы могли бы использовать:

 var keys = ["price", "publisher"]
let reduced = keys.reduce(into: [String]()) { result, current in
    guard let items = dict[current] else { return }
    let itemsStr = items.compactMap {$0.itemId }.joined(separator: ",")
    result.append("(current):(itemsStr)")
}
let finalStr = reduced.joined(separator: ";")
print(finalStr)
 

Идея:
Перебирайте необходимые ключи (и гарантированный порядок), создайте для каждого ключа список itemsIds, к которому присоединяется «,», а затем добавьте его вместе с ключом.
Наконец, присоединился ко всему этому.

Дополнительные вопросы: Почему name и itemId необязательно? Это нормально?

Примечание для сайта: предоставление первой части (легко воспроизводимый ввод) может увеличить изменение ответов, поэтому нам не нужно воссоздавать поддельные данные для проверки наших ответов.

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

1. Спасибо. name и itemId да, на данный момент серверная служба находится на начальной стадии.

Ответ №2:

Попробуйте следующее: порядок ключей может отличаться, поскольку это словарь, а порядок не имеет значения в dict

 print(
    yourDict.map { (key, values) -> String in
        "(key): (values.compactMap { $0.itemId }.joined(separator: ","))"
    }.joined(separator: ";") 
)