【问题标题】:How do I access an Array stored in a Dictionary in Swift?如何在 Swift 中访问存储在字典中的数组?
【发布时间】:2014-09-16 23:09:24
【问题描述】:

这就是我使用数组创建字典的方式:

@IBAction func didTapSaveButton(sender: UIButton) {
    var hooObject = Dictionary<String, [String]>()
    hooObject["\(dayLabel.text)"] = ["\(fromTimeLabel.text) - \(toTimeLabel.text)", "\(costField.text)"]
    NSLog("RESULT: \(hooObject)")
}

NSLog 结果:

 RESULT: [Optional("Wednesday"): [Optional("9:00 PM") - Optional("3:00 PM"), 40.00]]

我试过了:

@IBAction func didTapSaveButton(sender: UIButton) {
    var hooObject = Dictionary<String, [String]>()
    hooObject["\(dayLabel.text)"] = ["\(fromTimeLabel.text) - \(toTimeLabel.text)", "\(costField.text)"]
    var res = hooObject["Wednesday"]
    NSLog("RESULT: \(res)")

}

这返回 nil,这对我来说没有意义。星期三是存储的密钥,所以我认为返回数组就足够了。

我想做的事:

基本上我有一个包含 7 个部分的表格,每个部分代表一天。在每一天,我都在存储时间段以及在该时间段中预订活动的费用。

当我使用 numberOfRowsInSection 时,我将能够使用 Dictionary 键来获取将在 tableView 中显示的特定日期的行数(时隙)。这是我能想到的最简单的使用 NOSql 的方法。

我将字典存储在 parse.com 的列中,并在我的 tableView 中访问该字典。

无论如何,我不明白为什么我似乎无法使用密钥访问数组。我可以轻松地使用 NSMutableDictionary,但我在所有项目中都使用 Swift 作为学习体验。

想知道将字典与字典一起使用是否会更好,例如["fromTime":value, "toTime":value, "cost":value]

将不胜感激任何帮助。

感谢您的宝贵时间。

【问题讨论】:

  • 很难说没有看到完整的课程,但看起来您正在事件处理程序中填充 hooObject 字典。如果是这样,它将在该方法结束时消失,因此以后无法访问数据。您希望它成为您的类的实例属性。
  • 是的,只是在字典中手动输入字符串,而不是从标签和文本字段中获取文本,当我调用 hooObject["Wednesday"] 时,它会显示数组。将尝试您的建议。
  • @NateCook 我将 hooObject 设为实例变量,但没有区别。在我点击保存后,标签文本和字段文本中的文本仍然存在,并且我没有关闭视图或任何其他内容,因此我认为我可以访问它们。对我来说毫无意义。我想我误解了你所说的可能发生的事情。
  • 这一行: var res = hooObject["Wednesday"] NSLog("RESULT: (res)") 实际上是在上面的方法中调用的,因此这些值应该仍然可以访问。我已经编辑了我的问题。
  • @NateCook 我又试了一次,但这次用“星期三”替换“(dayLabel.text)”并且它有效。因此,“(dayLabel.text)”和“星期三”存储在其中的字符串与“星期三”不同。嗯

标签: ios cocoa-touch swift swift-dictionary swift-array


【解决方案1】:

问题来自于在dayLabel.text 上使用字符串插值——因为那是String? 而不是String,所以您最终会使用“可选(星期三)”而不是“星期三”作为键。你需要像这样打开它:

@IBAction func didTapSaveButton(sender: UIButton) {
    var hooObject = Dictionary<String, [String]>()
    if let day = dayLabel.text {
        hooObject["\(day)"] = ["\(fromTimeLabel.text) - \(toTimeLabel.text)", "\(costField.text)"]
        NSLog("RESULT: \(hooObject)")
    }
}

您可能需要对 from 和 to 时间字段执行类似的操作才能获得所需的值。

【讨论】:

  • 刚才也想通了。我真的不明白为什么我可以在我的其他标签上不这样做。
【解决方案2】:

我的回答:

@IBAction func didTapSaveButton(sender: UIButton) {
    var hooObject = Dictionary<String, [String]>()
    hooObject["\(dayLabel.text!)"] = ["\(fromTimeLabel.text) - \(toTimeLabel.text)", "\(costField.text)"]
    var res = hooObject["Wednesday"]
    NSLog("RESULT: \(res)")
}

我不得不将 dayLabel.text 更改为 dayLabel.text!

那些感叹号真的让我很困惑。起初我认为它们就像指针,因为它们不能用于 Int、Float 等(我认为)。

但事实上我需要一个在 dayLabel.text 结尾而不是我的其他标签,这让我更加困惑。我想我迟早会有我的啊哈时刻。我确实在这里阅读了一些帖子,但仍然不太明白。

【讨论】:

  • 耶,不要那样做 - 如果没有设置 dayLabel.text,你的应用会当场崩溃。
  • 我总是在提交表单之前进行表单验证。
  • 使用! 来解决您不确定的编译器问题是很危险的——您正在用编译器问题换取运行时问题,从而消除了 Swift 的一个重要安全特性。阅读this section on Optionals 以更好地了解正在发生的事情。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多