0

这东西太基本了,我敢肯定有人问过它,但我找不到。

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

4

3 回答 3

2

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)
于 2016-11-10T14:44:16.123 回答
1

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

于 2016-11-10T14:34:33.730 回答
1

您的变量被声明为一个 Int

var anotherVariable: Int

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

于 2016-11-10T14:48:45.563 回答