swift 将多维数组的分组字典Map到结构

cclgggtu  于 2023-04-04  发布在  Swift
关注(0)|答案(2)|浏览(117)

我有一个多维数组:tempCalculatorArray [[String]]-它总是带有2个字符串,即“AMT”,“简单评分系统”。
我想在一个UITableView中显示我的数组,并根据第一个String值的第一个字母将它分组为几个部分。
到目前为止,我已经根据第一个字符串的第一个字母从数组中创建了一个分组字典,然后创建了一个用于分组字典的键的排序数组。

let groupedDictionary = Dictionary(grouping: tempCalculatorArray, by: { $0[0].prefix(1) } )

let keys = groupedDictionary.keys.sorted()

这些值看起来像预期的那样工作:

keys = ["A", "C", "G", "N", "T", "W"] 

groupedDirectory = [
    "G": [
        ["GCS", "Some basic description text"],
    ],
    "N": [
        ["NEWS2", "Some basic description text"],
    ],
    "A": [
        ["AMTS", "Some very basic description text"],
        ["AUDIT-C", "Some really basic description text"],
    ],
    "W": [
        ["WELLS DVT", "Some basic description text"],
        ["WELLS PE", "Some basic description text"],
    ],
    "T": [
        ["TRUELOVE WITTS", "Some basic description text"],
    ],
    "C": [
        ["CURB65", "Some basic description text"],
    ]
]

我已经创建了一个结构体来保存我想在各种表函数中访问的信息:字母是关键字,即'A' 'B' 'C','title'是分组数组中的第一个字符串,'tagline'是第二个字符串。

struct Section {
   let letter : String
   let title : String
   let tagline : String
}

我遇到的问题是,我不明白如何将上面的分组字典Map到结构体中,所有A都在一起,所有B都在一起等。
我已经看到了一些例子,只有基本的数组到字典,并得到了这个工作。然而,我不能找到如何做到这一点与多维数组到字典。我已经尝试了下面的,但它是完全错误的,并不断得到错误的标题和标语命令:

sections = keys.map {
    Section(
        letter: $0,
        title: groupedDictionary[$0]![$0].sorted(),
        tagline: groupedDictionary[$0]![$1].sorted()
    )
}

感谢任何帮助。一旦我填充了'sections'结构,我已经知道如何在UITableView中使用它。

kpbpu008

kpbpu0081#

我认为你的Section是错误的。目前,它不能处理你的样本的"A"部分。
这样会更好

struct Section { 
    let letter: String 
    let items: [Item] 

    struct Item { 
        let title: String 
        let tagline: String
    }
}

现在,您可以Map:

let sections = groupedDirectory.map { aSectionDict in 
    let items = aSectionDict.value.map { aSectionValue in
        Section.Item(title: aSectionValue[0], tagline: aSectionValue[1])
    }
    return Section(letter: aSectionDict.key, items: items)
}.sorted(by: { $0.letter < $1.letter })
3zwtqj6y

3zwtqj6y2#

@Larme上面给出了答案。非常清楚。对于任何其他人发现这很有用,我唯一的补充是检索在UITableView中使用的变量

func numberOfSections(in tableView: UITableView) -> Int {return sections.count}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {return sections[section].items.count}

func sectionIndexTitles(for tableView: UITableView) -> [String]? {return sections.map{$0.letter}}
    

func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {return sections[section].letter}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
                guard let cell = tableView.dequeueReusableCell(withIdentifier: tableCell.reuseIdentifier, for: indexPath) as? tableCell else {
                    fatalError("Unexpected Index Path")
                }
let section = sections[indexPath.section].items[indexPath.row]
            
let title = section.title
let tagline = section.tagline
    
    
// Configure Cell
cell.title.text = String(title)
cell.tagline.text = String(tagline)
return cell
}

相关问题