没有初始值,程序不起作用

时间:2015-04-07 20:12:27

标签: ios macos cocoa swift

该程序与var dig = 0一起正常运行,并且不适用于var dig:Int我收到错误:Variable "dig" used before being initialized您能解释一下原因吗?

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)

2 个答案:

答案 0 :(得分:0)

编译器不太了解数学 认识到声明

if a % i == 0 && b % i == 0 {dig = i}

实际上至少执行一次(i == 1)。因此 编译器假定

可能未定义dig
println("\(dig) -  greatest common denominator of \(a) and \(b)")

中指定初始值
var dig = 0

是正确的解决方案。

顺便说一句,Euclidean Algorithm是一种更有效的方法 计算最大公约数,例如参见 http://rosettacode.org/wiki/Greatest_common_divisor#Swift

答案 1 :(得分:0)

您设置dig值的唯一位置是if循环内的for语句。 Swift编译器不知道for循环的主体是否会被执行,并且它不知道if语句是否真的是真的,所以它必须假设有<{1}}未初始化的路径。

考虑这个更简单的例子:

dig

此示例也会出现相同的错误,因为Swift会分别考虑每个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)") } 。对我们来说很明显a或者大于或等于b或者小于b,但是Swift在评估情况方面并没有那么远。它只是认为每个if可能不是iftrue只在dig内设置,所以有可能(就Swift而言) <{1}}可能未设置。

if

如果你将第二个条件更改为else,那么Swift很高兴,因为它可以推断dig必须是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)") } if并设置true每个路径,所以它肯定会在false语句之前有一个值。