Swift 为什么我不能为类型为';[String:[String]';带有类型为';String.SubSequence';(又名子字符串)?

Swift 为什么我不能为类型为';[String:[String]';带有类型为';String.SubSequence';(又名子字符串)?,swift,dictionary,Swift,Dictionary,我有一个数组,我想把它转换成字典,我声明了一个函数,但每次编译时都会出现这个错误 “无法使用'String.SubSequence'(也称为'Substring')类型的参数为'[String:[String]]]'类型的值下标。” 我的代码是 let animals = ["Bear", "Black Swan", "Buffalo", "Camel", "Cockatoo", "Dog", "Donkey", "Emu", "Giraffe", "Greater Rhea", "Hippop

我有一个数组,我想把它转换成字典,我声明了一个函数,但每次编译时都会出现这个错误 “无法使用'String.SubSequence'(也称为'Substring')类型的参数为'[String:[String]]]'类型的值下标。”

我的代码是

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 })
    }

您可以简单地使用
字典的
初始化(分组:by:)
初始化器
,如下所示

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"]

您可以简单地使用
字典的
初始化(分组:by:)
初始化器
,如下所示

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"]

您只需将
子字符串
,即
animalKey
转换为
字符串
,您的代码就可以正常工作

let animalKey = String(animal[..<secondLetterIndex])

let animalKey=String(animal[…您需要做的就是将
子字符串
,即
animalKey
转换为
字符串
,您的代码将按预期工作

let animalKey = String(animal[..<secondLetterIndex])

让animalKey=String(动物[…你希望从“动物”数组中得到什么输出“字典”?@PGDev我编辑了这个问题来演示输出字典应该是什么样子的。你希望从“动物”数组中得到什么输出“字典”?@PGDev我编辑了这个问题来演示输出字典应该是什么样子的。眼睛,你的回答对我来说很好,我可以解释一下吗把这个转换放在这里一点,因为它对我来说有点模糊,我不能理解在前面输入字符串背后的意义(动物)[…@AhmedBahgat您只需将
子字符串
传递给
字符串
初始化器。
子字符串
字符串
是不同的类型,并且您的
字典
是类型
字典
,因此您需要
字符串
作为
字典
的键。因此您需要转换
子字符串
转换为
字符串
,您可以使用
字符串
的init执行此操作,该init接受
子字符串
。这应该标记为答案,因为它按要求回答了问题。是的,您的答案对我很有效,我可以解释一下此转换,因为它对我来说有点模糊,我无法理解在(动物)之前键入字符串后面的点[…@AhmedBahgat您只需将
子字符串
传递给
字符串
初始化器。
子字符串
字符串
是不同的类型,并且您的
字典
是类型
字典
,因此您需要
字符串
作为
字典
的键。因此您需要转换将子字符串
分解为一个
字符串
,您可以使用
字符串
的init执行此操作,该init接受一个
子字符串
。这应该标记为答案,因为它在回答问题时回答了问题。好吧,这是一个令人惊讶的答案,并且使我的代码太少了,请您解释一下字符串是什么($0.first!)?
字符串($0.first!)
是元素分组所基于的
字典的键。这是一个令人惊讶的答案,并且使我的代码太少了,请您解释一下字符串($0.first!)?
字符串($0.first!)
是元素分组所基于的
字典的键。