【问题标题】:Swift automatically creating temporary dictionariesSwift 自动创建临时字典
【发布时间】:2015-08-09 19:32:30
【问题描述】:

我正在使用 UITableView 的数据源,我需要一个带有字典的数组。

我尝试创建一个数组,并在这样的 for 循环中用字典填充它。

temporaryDataDict = [:]
temporaryDataDict = ["name":stockName, "ticker":ticker, "lastPrice":lastPrice, "purchasePrice":purchasePrice, "weight":weight, "daysHeld":daysHeld]
temporaryDataArray.append(temporaryDataDict)

当然,当我开始用数据源填充我的 tableView 时。我最终得到了 23 个完全相同的字典(for 循环中的最后一个)。

这是当然的,因为它每次都在改变字典。

我无法找到将数据保存在字典中的方法,或者每次都以编程方式创建一个新字典(因为它们需要一个新名称,否则它会覆盖数据)。

那么我如何在每次 for 循环运行时以编程方式制作字典,然后获取这些字典的键和值?

还是我完全错了?

如果有帮助,这就是我正在使用的数据类型。

我有一个包含 6 个属性的库存(或项目)。所以我认为拥有一个数组是最有意义的,其中数组中的每个项目都是“股票”作为包含 6 个属性的字典。

那么是否可以让 swift 自动为我创建这些词典?因为我不知道需要多少字典。

附言。 我知道这就是 CoreData 的用途。我正在使用这些数组和字典稍后填写我的 CoreData。

如果上述方法不可行,我知道我可能可以创建一个新的 CoreData 实体来完成我想要的,但这似乎不是最好的方法。

任何帮助将不胜感激!谢谢

【问题讨论】:

  • 你为什么不为你需要的数据创建一个 Stock 类或结构,而不是将其存储在字典中?
  • 用这六个属性创建一个数据对象(类),而不是六个项目的字典,创建它们然后添加到数组中。
  • 感谢 cmets。绝对是要走的路。你们中的任何一个都可以发布一个答案,解释我如何访问类或结构中的特定数据点吗?
  • @MarkL 您能否发布完整的相关代码,例如您正在使用的循环以及您需要股票数组的用途?

标签: ios uitableview swift dictionary


【解决方案1】:

我不认为字典是在这种情况下使用的最佳数据结构。因为字典通常由唯一的键和值组成。

我已经编辑了这个答案。最初我建议创建一个包含每个记录字段的属性的类。然后我认为这可以通过typealias 为每条记录使用元组来完成。使用typealias 可以解决与创建元组数组相关的问题。

ETA:不过,请阅读 cmets,因为比我更了解这一点的 Zaph 认为使用 Class 是一种更强大的解决方案。

这是我基于元组的解决方案。接下来的大部分内容只是快速创建一些虚拟数据:

    typealias StockRecord = (stockName:String, ticker: String, lastPrice: Double, purchasePrice: Double, weight: Double, daysHeld: Int)

    var temporaryDataArray = [StockRecord]()

    // use a loop to create dummy records and add each to the array
    // rough and ready - just to test the solution
    var loopCounter: Int
    for loopCounter = 0; loopCounter <= 23; loopCounter++ {

        //some dummy field values for each record
        var stockName = "stockName" + ("\(loopCounter)")
        var ticker = "ticker" + ("\(loopCounter)")
        var lastPrice = Double(loopCounter)
        var purchasePrice = Double(loopCounter)
        var weight = Double(loopCounter)
        var daysHeld = loopCounter

        var newRecord = (stockName, ticker, lastPrice, purchasePrice, weight, daysHeld)
        temporaryDataArray.append(newRecord)
    }

ETA:遍历数组 - 例如:

for recordEntry in temporaryDataArray {
    var a = recordEntry.stockName
    var b = recordEntry.ticker
    // etc
}

或使用枚举 - 例如:

for (count,recordEntry) in enumerate(temporaryDataArray) {
    println("\(count)  \(recordEntry)")
}

输出:

0  (stockName0, ticker0, 0.0, 0.0, 0.0, 0)
1  (stockName1, ticker1, 1.0, 1.0, 1.0, 1)
2  (stockName2, ticker2, 2.0, 2.0, 2.0, 2)
3  (stockName3, ticker3, 3.0, 3.0, 3.0, 3)
etc

【讨论】:

  • 为什么您认为typealias 是比class 更好的解决方案?左大括号和右大括号也不匹配。
  • @Mark L:在本例中,数组中第 4 项的 lastPrice 将是 temporaryDataArray[3].lastPrice,例如 println(temporaryDataArray[3].lastPrice)
  • @zaph - 好点。我对这个问题的理解是,这里的目的是创建一个临时数据结构。在这种情况下,元组似乎是一种轻量级的解决方案。顺便说一句 - IIRC 斯坦福 Swift 课程教导尽可能避免使用 inits。我想知道这与 Swift 方法是否有很大不同。
  • @zaph - 我已经进一步编辑了我的答案,以记录您的明智观点。为了以后通过搜索访问此线程的任何人的利益。
  • 我用上面的方法用一个简单的计数器设置了它。它似乎有效,一个奇怪的错误,一个特定的项目多次出现?但这与这个问题无关。十分感谢你的帮助。 (以元组为例)
猜你喜欢
  • 2017-02-02
  • 1970-01-01
  • 2011-08-19
  • 1970-01-01
  • 1970-01-01
  • 2015-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多