这与问题 here 有关,但答案只显示了如何使该实例工作,但没有解释哪里出了问题,所以我不确定如何使我的工作正常。 以下是有问题的代码:
let texts = ["abcdeb", "abbd", "abde", "abcd", "abcde"]
var start = 0
while start < texts.count {
var newtexts = texts[start..<texts.count] + texts[0..<start]
print("ding", newtexts)
print("dong", newtexts[0])
start += 1
}
它产生以下内容:
ding ["abcdeb", "abbd", "abde", "abcd", "abcde"]
dong abcdeb
ding ["abbd", "abde", "abcd", "abcde", "abcdeb"]
fatal error: ArraySlice index out of range
通过将我引用的索引更改为 1,我使循环成功了两次,但两次结果都是“abbd”。 2 让我获得三个成功的循环和“abde”,等等。
知道发生了什么以及如何解决它吗?
谢谢!
编辑:如果我切换到“newtexts[newtext.startIndex]”,我可以让它工作,但我不确定为什么每次我都在创建一个新数组时,startIndex 不应该总是 0 吗?
最佳答案
这行得通
let texts = ["abcdeb", "abbd", "abde", "abcd", "abcde"]
var start = 0
while start < texts.count {
var newtexts = texts[start..<texts.count] + texts[0..<start]
print("ding", newtexts)
print("dong", newtexts[start]) // Or, you could use Array(newtexts)[0] instead of newtexts[start]
start++
}
显然是 newTexts
的第一个值每次运行循环时都不能被 0 访问。 在循环运行一次后,newtexts
不再有可被0访问的元素,第二次运行时,不再有可被1访问的元素,以此类推。这是因为您定义 newtexts
的方式.
如果你创建一个新数组,例如,
var arrayz = texts[1...3] + texts[3...4]
arrayz[0] // Error, Bad instruction...
你在这里得到一个错误,因为这个新的“数组”包含可以从 1
开始访问的元素。 .这类似于您之前的循环中发生的情况。
“数组”newtexts
(或 arrayz
)您正在创建的实际上不是一个数组;它的类型是 ArraySlice<String>
.这意味着它不会像普通数组那样被访问。您将能够根据您定义它的方式访问它的元素。
希望你明白。 :)
关于arrays - Swift ArraySlice 索引超出 While 循环中非空数组中 Item[0] 的范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34035694/