Swift:如何为字典的额外键创建新的indexPath

时间:2019-03-17 11:56:24

标签: ios swift dictionary

我希望对字典中的所有键进行字典的迭代,而不仅仅是对indexPath.row中的一个键进行

struct Whatever {
   var title: String
   var tag: [String:String?]?
}

var cases = [
     Whatever(title: "Name1", tag: ["key1": "value1", "key2":"value2"]),
     Whatever(title: "Name2", tag: ["key3": "value3"]
]

稍后在ViewController中:

let arrayCases = cases[indexPath.row]
let caseTag = arrayCases.tag!

for key in caseTag.keys {
    cell.titleLabel?.text = key
    //the magic stops somewhere here

}

for value in caseTag.values {
    if value != nil {
        cell.txt.text = value
    } else {
        cell.txt.text = arrayCases.title
    }
}

您能告诉我如何为第二个标签创建新的indexPath.row吗?好像是“无论如何”的单独保险? 第二个问题-为什么每次构建不同的标签后都会显示-有时是“ tag1”,有时是“ tag2”? 谢谢!

2 个答案:

答案 0 :(得分:0)

如果使用标准表视图(无节),则数据源中的每个项目都代表一个行。您不能简单地创建新的indexPath.row

您有两个选择:

  1. 使用节:一个Whatever是一个 ,其中title是标题,每个tag是一个 (请参见下面的代码)

  2. 连接标签键和值

    cell.titleLabel?.text = caseTag.keys.joined(separator: ", ") 
    
    cell.txt.text = caseTag.values.joined(separator: ", ") 
    

关于第二个问题:字典是无序的,没有顺序。如果您需要特定的命令,请使用另一个结构Tag并以tags为数组

struct Whatever {
    let title: String
    let tags: [Tag]
}

struct Tag {
    let key, value : String
}

let cases = [
    Whatever(title: "Name1", tags: [Tag(key: "key1", value: "value1"), Tag(key: "key2", value: "value2")]),
    Whatever(title: "Name2", tags: [Tag(key: "key3", value: "value3"), Tag(key: "key4", value: "value4")])
]

func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
    let case = cases[section]
    return case.title
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

...

    let section = cases[indexPath.section]
    let case = section.tags[indexPath.row]
    cell.titleLabel?.text = case.key
    cell.txt.text = case.value

答案 1 :(得分:0)

我会在您的结构中添加两个计算出的属性,这些属性分别返回一个标记键和值的列表,以使其余代码更简洁。

var allTagKeys: String {
    if let keys = tag?.keys {
        return keys.sorted().joined(separator: ", ")
    }
    return ""
}

var allTagValues: String {
    if let values = tag?.compactMap({ $0.value }) {
        return values.joined(separator: ", ")
    }       
    return ""
}

}

请注意,我在键中添加了排序功能,但不确定是否要这样做。

相关问题