Почему я не могу добавить значение типа «[String: [String]]» с аргументом типа «String.SubSequence» (он же «Substring»)? - PullRequest
1 голос
/ 18 февраля 2020

У меня есть массив, который я хочу преобразовать в словарь, и я объявил функцию, чтобы сделать это, но я получаю эту ошибку каждый раз, когда я компилирую "Не могу подписать значение типа '[String: [String]]' с помощью аргумент типа 'String.SubSequence' (он же 'Substring') "

мой код

let animals = ["Bear", "Black Swan", "Buffalo", "Camel", "Cockatoo", "Dog", "Donkey", "Emu", "Giraffe", "Greater Rhea", "Hippopotamus", "Horse", "Koala", "Lion", "Llama", "Manatus", "Meerkat", "Panda", "Peacock", "Pig", "Platypus", "Polar Bear", "Rhinoceros", "Seagull", "Tasmania Devil", "Whale", "Whale Shark", "Wombat"]
   var animalsDict = [String: [String]]()
    var animalSectionTitles = [String]()

 func createAnimalDict() {
        for animal in animals {
            let secondLetterIndex = animal.index(animal.startIndex, offsetBy: 1)
            let animalKey = animal[..<secondLetterIndex]
            if var animalValues = animalsDict[animalKey] {
                animalValues.append(animal)
                animalsDict[animalKey] = animalValues
            }else {
                animalsDict[animalKey] = [animal]
            }
        }
        animalSectionTitles = [String](animalsDict.keys)
        animalSectionTitles = animalSectionTitles.sorted(by: { $0 < $1 })
    }

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

let animals: [String: [String]] = ["B" : ["Bear", "Black Swan", "Buffalo"],

"C" : ["Camel", "Cockatoo"],

"D" : ["Dog", "Donkey"],

"E" : ["Emu"],

"G" : ["Giraffe", "Greater Rhea"],

"H" : ["Hippopotamus", "Horse"],

"K" : ["Koala"],

"L" : ["Lion", "Llama"],

"M" : ["Manatus", "Meerkat"],

"P" : ["Panda", "Peacock", "Pig", "Platypus", "Polar Bear"],

"R" : ["Rhinoceros"],

"S" : ["Seagull"],

"T" : ["Tasmania Devil"],

"W" : ["Whale", "Whale Shark", "Wombat"]]

Ответы [ 2 ]

4 голосов
/ 18 февраля 2020

Вы можете просто использовать Dictionary's init(grouping:by:) initializer, например,

var animalsDict = Dictionary(grouping: animals) { String($0.first!) }

var animalSectionTitles = animalsDict.keys.sorted()

Выход:

print(animalsDict) //["G": ["Giraffe", "Greater Rhea"], "P": ["Panda", "Peacock", "Pig", "Platypus", "Polar Bear"], "E": ["Emu"], "H": ["Hippopotamus", "Horse"], "K": ["Koala"], "L": ["Lion", "Llama"], "R": ["Rhinoceros"], "D": ["Dog", "Donkey"], "B": ["Bear", "Black Swan", "Buffalo"], "M": ["Manatus", "Meerkat"], "W": ["Whale", "Whale Shark", "Wombat"], "S": ["Seagull"], "T": ["Tasmania Devil"], "C": ["Camel", "Cockatoo"]]

print(animalSectionTitles) //["B", "C", "D", "E", "G", "H", "K", "L", "M", "P", "R", "S", "T", "W"]
1 голос
/ 18 февраля 2020

Все, что вам нужно сделать, это преобразовать Substring, а именно animalKey в String, и ваш код работает так, как ожидалось.

let animalKey = String(animal[..<secondLetterIndex])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...