Ios 没有初始值,程序无法运行

Ios 没有初始值,程序无法运行,ios,macos,cocoa,swift,Ios,Macos,Cocoa,Swift,该程序在使用var dig=0时运行良好,但在使用var dig:Int时不起作用。我得到一个错误:在初始化之前使用了变量dig。您能解释一下原因吗 func myFunc(a:Int, b:Int) { var c = a / b var o = a % b var v = 0 var dig = 0 if o != 0 {println("\(a)/\(b) = \(c) и \(o)/\(b)")} else {println("\(a)/\

该程序在使用var dig=0时运行良好,但在使用var dig:Int时不起作用。我得到一个错误:在初始化之前使用了变量dig。您能解释一下原因吗

func myFunc(a:Int, b:Int) {
    var c = a / b
    var o = a % b
    var v = 0
    var dig = 0
    if o != 0 {println("\(a)/\(b) = \(c) и \(o)/\(b)")}
    else {println("\(a)/\(b) = \(c)")}

    if a > b {
        v = b
    }
    else {
        v = a
    }
    for var i = 1; i <= v; ++i {
        if a % i == 0 && b % i == 0 {dig = i}
    }
    println("\(dig) -  greatest common denominator of \(a) and \(b)")
}

myFunc(27,81)

编译器的数学知识不足以 承认该声明

if a % i == 0 && b % i == 0 {dig = i}
对于i==1,至少实际执行一次。因此 编译器假定dig可能在以下位置未定义:

println("\(dig) -  greatest common denominator of \(a) and \(b)")
在中指定初始值

var dig = 0
这是正确的解决方案

顺便说一句,这是一个更有效的方法 计算最大公约数,参见示例
.

设置dig值的唯一位置是for循环中if语句的内部。Swift编译器不知道for循环的主体是否将被执行,也不知道if语句是否为true,因此它必须假设存在一个dig未初始化的路径

考虑这个更简单的例子:

func myFunc(a:Int, b:Int) {
    var dig: Int

    if a >= b {
        dig = 3
    }

    if a < b {
        dig = 4
    }
    println("\(dig) -  greatest common denominator of \(a) and \(b)")
}

如果将第二个条件更改为else,Swift会很高兴,因为它可以推断If必须为true或false,并且在每个路径中都设置了dig,因此它肯定会在println语句之前有一个值。

在dig从未给定值的情况下,代码可以采用一个路径,然后尝试打印未定义的值。var dig:Int如何?。我经常搞混吗?和所以它可能是其中之一。尝试它们编译器正试图保护您免受一个讨厌的、难以检测的错误的影响——使用一个尚未初始化的变量。这些类型的错误可能是噩梦,因为它们通常只在调试器更擅长清除内存等的情况下才显示为发布。在任何语言中,如果声明变量后没有立即初始化,则在声明变量时总是初始化变量是最佳做法。这是一个非常便宜的操作可以节省你很多悲伤。斯威夫特在这里强制执行。
func myFunc(a:Int, b:Int) {
    var dig: Int

    if a >= b {
        dig = 3
    } else {
        dig = 4
    }
    println("\(dig) -  greatest common denominator of \(a) and \(b)")
}