将值赋给swift 3中If else块内的变量

时间:2016-11-10 14:28:06

标签: swift swift3 xcode8.1

这件事情是如此基本我确信已被问到但是我找不到它。

我正在快速3个游乐场进行实验,我想运行此代码:

import UIKit

var optionalVariable: Int? = 32
var anotherVariable: Int
if optionalVariable != nil{
    print("This executed")
    anotherVariable = 32
}
print(anotherVariable)

无法运行,我收到此错误:

Playground execution failed: error: chapter4.playground:5:7:
error: variable 'anotherVariable' used before being initialized
print(anotherVariable)

那有什么不对?当我为其分配值时,为什么我不能使用anotherVariable的值?

如果我注释掉最后一行print(anotherVariable), 代码运行,输出打印为This executed

3 个答案:

答案 0 :(得分:2)

Swift中有一条铁律:任何变量必须在使用其值之前初始化。

该行

var anotherVariable: Int

声明变量,但不初始化

如果optionalVariable为零,则anotherVariable未初始化并导致崩溃。编译器可以在编译时检测到它并显示错误消息。

指定默认值,将声明行更改为

var anotherVariable = 10 // or 0 or whatever

或添加else子句

var optionalVariable: Int? = 32
var anotherVariable: Int
if optionalVariable != nil{
    print("This executed")
    anotherVariable = 32
} else {
    anotherVariable = 10
}
print(anotherVariable)

答案 1 :(得分:1)

编译器会看到存在anotherVariable未初始化的路径(optionalVariablenil时)。这可能发生在例如另一个线程将此可选变量设置为nil。它不会发生在您的代码中,但编译器无法知道这一点。在将其传递给函数之前,您必须在某个时刻初始化anotherVariable

答案 2 :(得分:1)

您的变量被声明为Int

var anotherVariable: Int

问题在于,当您打印变量时,它可以是未初始化的(当optionalVariablenil时)。 Int必须具有值,并且编译器不会为您设置默认值,除非它是可选类型。任何类型或类在首次使用之前都应该有一个值,这就是您在评论print行时没有错误的原因。

有两种方法可以解决这个问题。

  • 通过初始化声明确保anotherVariable在某个时间点初始化

    var anotherVariable: Int = 0
    

    或在else案例

    中这样做
    if optionalVariable != nil{
        print("This executed")
        anotherVariable = 32
    }
    else {
        anotherVariable = 0
    }
    
  • 或将anotherVariable设为可选(将其声明为Int?

    var anotherVariable: Int?
    

    默认情况下它是nil。这与

    相同
    var anotherVariable: Int? = nil
    

如果你来自C,那就是防止一些边缘情况,其中变量包含先前分配的值。