【问题标题】:Swift array always give me "fatal error: Array index out of range"Swift 数组总是给我“致命错误:数组索引超出范围”
【发布时间】:2016-04-13 16:37:05
【问题描述】:

我在 Swift 中遇到了数组问题,我想创建一个这样的数组:

var Test : [[String]] = [[]]
let test_string = "HELLO"

   for var i = 0; i <= 15; ++i {
      for x in test_string.characters {
         Test[i].append("\(i)\(x)")
      }
   }

print(Test[1][1]) // This should print 1E

但这总是给我这个错误! :

fatal error: Array index out of range

我在这里缺少什么?

【问题讨论】:

  • 你没有在Test上追加任何东西,执行Test[i].append("\(i)\(x)")时没有Test[0]

标签: arrays swift swift2


【解决方案1】:

你的数组是空的,所以没有Test[0](从技术上讲,你将它初始化为[[]],这意味着它有一个元素,所以Test[0]确实存在,但是Test[1]不存在,这令人困惑)。您需要将每个元素初始化为一个空数组:

var Test : [[String]] = [] // This really should be an empty array for consistency.
let test_string = "HELLO"

   for var i = 0; i <= 15; ++i {
      Test.append([]) // <== initialize the array
      for x in test_string.characters {
         Test[i].append("\(i)\(x)")
      }
   }

print(Test[1][1]) // This should print 1E

不过,这不是很好的 Swift。不推荐使用 C 样式的 for 循环(此外,变量应始终为驼峰式,不得前导大写或使用下划线)。

这可以很好地转换为嵌套映射:

let testString = "HELLO"
let indexedCharacters = (0..<15).map { i in
    testString.characters.map { c in "\(i)\(c)" }
}

这会将数字 0-15 映射到基于字符的字符串数组中。一旦您了解了map 的基础知识,这应该比原始循环更容易理解。 (我并不是说map 通常比for 好。通常一个简单的for-in 循环是最好的。但是对于这样一个简单的映射,map 非常清晰并且很好地使用了Swift 的特性。)

【讨论】:

  • 已修复;这是append()。不过,这不是好的 Swift。我正在考虑如何改进它。
  • 是的,现在可以工作了 :) .. 但是为什么它不好 swift ,就什么而言,你能向我解释一下吗,我是 swift 的新手 :)
  • 另外,数组名应该是复数。虽然我不确定它们嵌套时应该是什么。很好的答案。
  • @Caleb 同意。试图选择一个更好的名字,虽然我不确定这个数组会被用来做什么,所以我也不确定这是最好的名字。 :D
  • 是的,我大部分时间都使用小写字母,但从现在开始,它将永远是lol ..感谢您的解释:),
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多