Swift 字典映射认为字符串是字符串数组

Swift 字典映射认为字符串是字符串数组,swift,dictionary,Swift,Dictionary,我试图用字典重新构造数据,但底部第5行给出的错误如下: 无法将“[String]”类型的值转换为预期的参数类型“String” 据我所知,Collapsed.category\u name和Item2.category\u name都是字符串,那么问题出在哪里?错误很明显 无法将“[String]”类型的值转换为预期的参数类型“String” 这行代码$0.value.map{$0.category_name}将返回[String]您正在使用属性category_name设置它,该属性categ

我试图用字典重新构造数据,但底部第5行给出的错误如下:

无法将“[String]”类型的值转换为预期的参数类型“String”


据我所知,Collapsed.category\u name和Item2.category\u name都是字符串,那么问题出在哪里?

错误很明显

无法将“[String]”类型的值转换为预期的参数类型“String”

这行代码$0.value.map{$0.category_name}将返回[String]您正在使用属性category_name设置它,该属性category_name是字符串类型,基于您在menu2数组中添加的数据,您需要设置的是分组字典中第一个对象的category_name,因为category_id和category_name都属于对方

所以不是

你需要有

解决此问题后,您将在行项目上得到错误:$0.value.map{$0.name}

无法将“[String]”类型的值转换为预期的参数类型“[Item]”

所以不是

你需要有


你为什么要绘制地图?为什么不直接做category_name:$0.value.category_name@RakeshaShastri$0.value是数组,因此您需要从中访问第一个对象,因此它应该类似于category_name:$0.value.first?.category_name@RakeshaShastri我忘了添加我的项目结构以清楚说明。我之所以映射它,是因为我想在一个结构中折叠我的平面项目结构,该结构在每个类别下都有项目排序。我忘了添加我的项目结构,这不是打字错误。我现在加上去了。但在应用您的建议后,我在下一行遇到了类似的错误:无法将“String”类型的值转换为“Item”类型的闭包结果@Gimmethe411行是什么?对于Item struct?,您需要将其设置为默认空数组?@Gimmethe411也必须是错误,无法将“[String]”类型的值转换为闭包结果类型“[Item]”,我现在添加了它,是的,只是一个默认的空数组。@Gimmethe411请检查编辑过的答案并设置项:$0.value.map{Itemname:$0.name,rows:[]}
struct Item2 {
    var itemid: Int
    var category_id: Int
    var category_name: String
    var name: String
}

struct Item{
    var name = String()
    var rows = [Row]()
}

struct Row{
    var size: Int
}

struct Collapsed{
    var category_opened = Bool()
    var category_id = Int()
    var category_name = String()
    var items = [Item]()
}

let menu2 = [
    Item2(itemid: 5, category_id: 0, category_name: "category1", name: "item1"),
    Item2(itemid: 2, category_id: 0, category_name: "category1", name: "item2"),
    Item2(itemid: 3, category_id: 0, category_name: "category1", name: "item3"),
    Item2(itemid: 1, category_id: 1, category_name: "category2", name: "item4"),
    Item2(itemid: 7, category_id: 1, category_name: "category2", name: "item5"),
    Item2(itemid: 9, category_id: 1, category_name: "category2", name: "item6")]

let mapping = Dictionary(grouping: menu2, by: { $0.category_id })
// Map that dictionary into an array of Sorted and then sort that array by category_id
let collapsedItems: [Collapsed] = mapping.map {
    Collapsed(
        category_opened: false,
        category_id: $0.key,
        category_name: $0.value.map { $0.category_name }, // Error: Cannot convert value of type '[String]' to expected argument type 'String'
        items: $0.value.map { $0.name }
    )
}
.sorted { $0.category_id < $1.category_id }
category_name: $0.value.map { $0.category_name },
category_name:  $0.value.first?.category_name ?? "", 
// You can force wrap the first property too as of you have make dictionary using grouping it will at least have single object.
items: $0.value.map { $0.name }
items: $0.value.map { Item(name: $0.name, rows: []) }