在接收函数 return 数组时执行过多的错误?

Executing bad excess on receiving a function return array?

接收和执行以下函数有什么问题:

 func FibFast(num: Int) -> Array<Int> {
        var fib_arr = [Int](num)
        if num < 1 {
            fib_arr[0] = 0
            return fib_arr
        } else if num < 2 {
            fib_arr[1] = 1
            return fib_arr
        }else {
            for var i = 2; i < num; i++ {
                fib_arr[i] = fib_arr[i-1] + fib_arr[i-2]
            }
            return fib_arr
        }
    }

当我尝试接收数组时:

var newArray = FibFast(10)

执行不当。

您正试图用不存在的索引下标数组,同样在您的其他情况下,您正试图在数组为空时下标到索引 2。

var fib_arr = [Int]() 行在整数上创建了一个空数组。当您使用 fib_arr[0] = 0 时,您试图将索引 0 处的值分配为 0,但当前不存在任何值。我建议使用 append(_) 方法,即。 fib_arr.append(0).

此外,当您将值 10 或任何大于等于 2 的值作为 num 参数传递时,您的 if-else if-else 语句正在执行您试图访问索引的 for 循环01 尚未设置为较早的语句,因为它们被 if-else if-else 块跳过而从未执行。

for 循环和下标赋值非常表明您可能在 swift 之前学习过另一种语言。您应该注意,您尝试使用的经典 c 风格 for 循环很快就会从 swift 中删除,因此最好养成不使用它的习惯。我已经按照您编写代码的方式重写了您的代码,如果您对此有任何疑问,请随时询问。

func fib(num: Int) -> [Int] {
  var fib_arr = [Int]()
  if num == 0 {
    fib_arr.append(0)
  } else if num == 1 {
    fib_arr.append(0)
    fib_arr.append(1)
  } else {
    fib_arr = [0, 1]
    for i in 2..<num {
      fib_arr.append(fib_arr[i - 1] + fib_arr[i - 2])
    }
  }
  return fib_arr
}

Blake Lockley提出的答案也可以这样编码:

func FibFast(num: Int) -> Array<Int> {
    var fib_arr = [Int]()   // empty array
    if num < 1 {
        fib_arr += [0]      // add element [0]
        return fib_arr
    } else if num < 2 {
        fib_arr += [0]      // add element [0]
        fib_arr += [1]      // add element [1]
        return fib_arr
    }else {
        fib_arr = [0, 1]    // init with [0, 1]
        for var i = 2; i < num; i++ {
            // add computed element
            fib_arr += [fib_arr[i-1] + fib_arr[i-2]]
        }
        return fib_arr
    }
}