为什么索引超出范围

时间:2019-12-13 18:25:33

标签: swift xcode

您好,我正在执行简单的FizzBu​​zz挑战。我想出了解决这个问题的办法。但是我不明白为什么我的第一次尝试超出了范围,或者幕后发生了什么。

为防止其超出我更改的范围

array.remove(at:i)

array.remove(at:i-1)

下面是我的整个项目。

第一次尝试

    var array = [String]()


for i in 1...100{



           array.append("\(i)")

           if i % 3 == 0 && i % 5 == 0 {

               array.remove(at: i)
               array.append("FizzBuzz")
           }else if i % 3 == 0{

               array.remove(at: i)
               array.append("Fizz")

           } else if i % 5 == 0{

               array.remove(at: i)
               array.append("Buzz")

           }


       }
print(array)

第二次尝试

var array = [String]()

for i in 1...100{

           array.append("\(i)")

           if i % 3 == 0 && i % 5 == 0 {

               array.remove(at: i - 1 )
               array.append("FizzBuzz")
           }else if i % 3 == 0{

               array.remove(at: i - 1)
               array.append("Fizz")

           } else if i % 5 == 0{

               array.remove(at: i - 1)
               array.append("Buzz") 
           }
       }
print(array)

3 个答案:

答案 0 :(得分:0)

你在说

for i in 1...100{

但是数组索引从0开始。因此,在每个循环中,您刚刚添加的项目都具有索引i-1。尚无索引为i的项目。

换句话说,请考虑代码的这一部分:

       if i % 3 == 0 && i % 5 == 0 {
           array.remove(at: i)

在这里您对i的含义不屑一顾。在第一行中,它是数字 i。但是在第二行中,索引i at 。而且由于您以1开头,所以这两个数字相隔1。例如,第一次通过循环i 1,但是值1是 at < / em>索引0。

答案 1 :(得分:0)

remove(at :)函数可删除指定位置的元素。例如,如果我有一个像[1,2,3,4]的数组,并且我调用array.remove(at:2),则结果数组将是[1,2,4]。

重要是要了解该函数会删除指定INDEX位置的元素。 不是值本身。 Swift数组的索引为零,第一个元素位于位置0。

现在,有了这方面的知识,我建议您继续使用一些打印语句调试第一个代码,这样您就可以快速了解为什么代码超出范围。希望通过本实验,您可以了解一些基本概念。

祝你好运!

答案 2 :(得分:0)

因为数组的索引为零,并且您在for循环中从1开始,所以当您到达3并尝试检索第三个元素(表明它们是数组中的四个元素)时,swift将抛出错误。简单的解决方案是从0开始

for i in 0...100{

print(i)

           array.append("\(i)")

           if i % 3 == 0 && i % 5 == 0 {

               array.remove(at: i)
               array.append("FizzBuzz")
           }else if i % 3 == 0{

               array.remove(at: i)
               array.append("Fizz")

           } else if i % 5 == 0{

               array.remove(at: i)
               array.append("Buzz")

           }



       }
print(array)

}

Picture