#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: ";")
)