Ios 没有初始值,程序无法运行
该程序在使用var dig=0时运行良好,但在使用var dig:Int时不起作用。我得到一个错误:在初始化之前使用了变量dig。您能解释一下原因吗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)/\
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)")
}