我在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
我在这里缺少什么?
答案 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的功能。)