Swift数组总是给我"致命错误:数组索引超出范围"

时间:2016-04-13 16:37:06

标签: arrays swift swift2

我在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

我在这里缺少什么?

1 个答案:

答案 0 :(得分:3)

您的数组数组为空,因此没有Test[0](从技术上讲,您将其初始化为[[]],这意味着它有一个元素,因此Test[0]确实存在,但随后Test[1] 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循环(同样,变量应该始终是camelCase,绝不会使用大写字母或使用下划线)。

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

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的功能。)