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

Assigning value to a variable inside an If else block in swift 3

这东西太基础了,我确定有人问过它,但我找不到它。

我正在 swift 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), 代码 运行s,输出打印为 This executed.

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

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


var anotherVariable: Int

声明变量但不初始化它。

如果 optionalVariable 为 nil,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)

您的变量声明为 Int

var anotherVariable: Int

问题是当您打印变量时它可能未初始化(当 optionalVariablenil 时)。 Int 必须有一个值,编译器不会为您设置默认值,除非它是可选类型。任何类型或 class 在第一次使用之前都应该有一个值,这就是你在注释 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,这是为了防止一些边缘情况,其中变量包含以前分配的值。