gpt4 book ai didi

在开始初始化之前使用的 swift 3 变量

转载 作者:搜寻专家 更新时间:2023-11-01 06:03:33 24 4
gpt4 key购买 nike

我的 n 变量有问题。我不能在 for 循环中使用 n。为什么? n 在 for 循环之前被初始化。请帮忙。

import Foundation

var n: Int
var t: Int

while(true){

var tt = readLine()
t = Int(tt!)!
if (t==0){
break
}
else if ( t < 0){
n = t*(-1)
}
else if(t > 0){
n = t
}
var arr : [[String]] = []
for i in 0..<n*2{
for y in 0..<n*2{
arr[i][y] = "."
}
}
}

最佳答案

一个变量可以被声明而不是立即初始化,只要保证在第一次使用前初始化

这个错误比乍一看更微妙。您实际上可以在不初始化属性的情况下声明它,只要导致其首次使用的所有程序流程都确定了它的初始化。

问题在于 ifelse ifelse if block :

var n: Int // declaration

// ...

if (t == 0) {
break
}
else if (t < 0) {
n = t*(-1)
}
else if (t > 0){
n = t
}

// first use
for i in 0..<n*2 { /* ... */ }

Swift 不能推断这个 block 实际上是详尽无遗的,并且认为有可能上面的 if 语句都不成立,在编译器看来,这会导致以下程序状态:

  • 程序流程没有被打断(break)
  • n还没有被实例化

然而,作为人类,我们知道上面的 if - else if - else if block 确实是详尽无遗的,只需更改最后一个 if else 语句到简单的 else 语句。

if (t == 0) {
break
}
else if (t < 0) {
n = t*(-1)
}
// if none of the above, t > 0
else {
n = t
}

另外需要注意的是,嵌套数组访问不存在的数组元素,arr[i][y] = "."会导致运行时异常,但这是另外一个问题。在其当前形式中,嵌套循环的意图似乎可以替换为嵌套数组实例化:

var arr = [[String]](repeating: [String](repeating: ".", count: 2*n), count: 2*n)

或者,

var arr = (0..<2*n).map { _ in [String](repeating: ".", count: 2*n) }

关于在开始初始化之前使用的 swift 3 变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43604348/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com