【问题标题】:Fill empty array with multidimentional dictionary Swift用多维字典 Swift 填充空数组
【发布时间】:2017-02-26 21:38:38
【问题描述】:

我正在尝试用部分品牌名称填写表格视图。

现在我有这本词典

var manNames = ["A":["ABERCROMBIE & FITCH MEN","ACQUA DI PARMA MEN","ADAM LEVINE ΜΕΝ","AIGNER MEN","ANTONIO BANDERAS MEN","ARAMIS MEN","ARMANI GIORGIO MEN","AZZARO MEN"],"B":["BALDESSARINI MEN","BALDININI MEN","BENTLEY MEN","BOTTEGA VENETA MEN","BOUCHERON MEN","BREIL MILANO MEN","BRUT MEN","BURBERRY MEN","BVLGARI MEN"]]

在这个结构中符合什么

struct Objects {
    var sectionName : String!
    var sectionObjects : [String]!
}

拥有这个空的对象字典

var objectArray = [Objects]()

I fill it in with the following for loop

                let sortedNames = atoz.manNames.sorted(by: { $0.0 < $1.0 })
                for (key, value) in sortedNames {
                        objectArray.append(Objects(sectionName: key, sectionObjects: value))
                }

然后我在表格中填充数据,到目前为止一切正常。

在 cellForRowAt 中,这是我取每个品牌名称的方式

cell.companyName.text = objectArray[indexPath.section].sectionObjects[indexPath.row]

我想要实现的是让每个品牌名称都有自己的ID,所以当函数didSelectRowAt被执行时,我想把这个ID发送到下一个视图控制器,而不是名称品牌。

更准确地说。

AMBERCOMBIE has the ID 40
ACQUA DI PARMA has the ID 200

等等

如何为每个品牌名称编辑我现有的字典,使其拥有自己的 ID,然后从数组 objectArray 中获取它???

【问题讨论】:

  • 您的“数组”不是数组。这是一个[String : [String]] 字典。
  • @Fogmeister 你是对的,我现在将进行编辑。我的错。
  • 另外,为什么不把名字发过去呢?当其他视图控制器接收到唯一 id 时,你会如何处理它?
  • @Fogmeister 在我的 API 发出请求。这些字典将是动态的,这就是为什么我要发送 ID 而不是名称
  • 在那种情况下,我根本不会将它存储在这样的字典中。存储一个对象数组(不是字符串)并给每个对象一个名称和一个 ID。

标签: arrays swift dictionary swift3


【解决方案1】:

好的,遇到此类问题的第一件事就是定义模型。

在这种情况下,您的模型是Manufacturer(我从您代码中的“人”猜测)...另外,不要缩写变量名,这会使它们难以阅读。如果某物是“制造商”,则称其为“制造商”。

所以,它需要一个名称和一个 ID...

struct Manufacturer {
    let name: String
    let id: Int
}

接下来,您需要一个包含首字母的目录,作为将它们索引到各个部分的一种方式...

struct DirectorySection {
    let initialLetter: String
    let manufacturers: [Manufacturer]
}

还有……

(再次注意描述性命名)

现在你需要一个数组来处理...

let directory: [DirectorySection] = [
    DirectorySection(initialLetter: "A", manufacturers: [
            Manufacturer(name: "Abercrombie & Fitch", id: 40),
            Manufacturer(name: "ACQUA DI PARMA MEN", id: 50),
            Manufacturer(name: "ADAM LEVINE ΜΕΝ", id: 60),
            ....
        ]),
    DirectorySection(initialLetter: "B", manufacturers: [
            Manufacturer(name: "BALDESSARINI MEN", id: 130),
            Manufacturer(name: "BALDININI MEN", id: 131),
            Manufacturer(name: "BENTLEY MEN", id: 132),
            ....
        ]),
    ....
]

当然,如果需要,您可以在 plist 文件中定义它,或者在字典或 CoreData 存储等中定义它……如果它不改变,现在执行它的代码也一样好。只要确保以这种方式创建模型,无论您想以何种方式存储它。

现在您已经完成了所有需要的设置。

从 indexPath 中获取制造商...

let manufacturer = directory[indexPath.section].manufacturers[indexPath.row]

填充单元格...

cell.textLabel.text = manufacturer.name

将制造商传递给其他控制器...

controller.manufacturer = manufacturer

每当您处理Manufacturer 时,您都会传递一个完整的Manufacturer。你需要名字吗?在那里。需要身份证吗?它就在那里。

一旦你有了一个体面的数据模型,剩下的就很简单了。

注意

要从中删除的主要内容。请勿使用 objectArrayatozmanNamesObjects 之类的名称。它只会让事情变得难以理解。使用长的、描述性的名称并没有什么不好。他们有很多优点。

【讨论】:

  • 非常感谢。在阅读您的答案时,我也编写了此代码,但我对数组感到困惑。现在对我来说很清楚了!再次非常感谢
  • NOTE 部分点赞
猜你喜欢
  • 2015-07-29
  • 1970-01-01
  • 1970-01-01
  • 2017-11-24
  • 1970-01-01
  • 2019-03-06
  • 2023-01-26
  • 2011-01-11
相关资源
最近更新 更多