如何检查变量是否未在Swift中初始化?

如何检查变量是否未在Swift中初始化?,swift,null,optional,Swift,Null,Optional,Swift允许声明变量但不初始化变量。如何检查变量是否未在Swift中初始化 class myClass {} var classVariable: myClass // a variable of class type - not initialized and no errors! //if classVariable == nil {} // doesn't work - so, how can I check it? 您是对的,您不能将非可选变量与nil进行比较。当您声明但不提供非可选

Swift允许声明变量但不初始化变量。如何检查变量是否未在Swift中初始化

class myClass {}
var classVariable: myClass // a variable of class type - not initialized and no errors!
//if classVariable == nil {} // doesn't work - so, how can I check it?

您是对的,您不能将非可选变量与
nil
进行比较。当您声明但不提供非可选变量的值时,它不会像可选变量一样设置为
nil
。没有办法在运行时测试是否使用未初始化的非可选变量,因为任何使用这种变量的可能性都是一个可怕的、由编译器检查的程序员错误。唯一要编译的代码是保证每个变量在使用前都已初始化的代码。如果希望能够将
nil
赋值给变量并在运行时检查其值,则必须使用可选的

示例1:正确用法

func pickThing(choice: Bool) {
    let variable: String //Yes, we can fail to provide a value here...

    if choice {
        variable = "Thing 1"
    } else {
        variable = "Thing 2"
    }

    print(variable) //...but this is okay because the variable is definitely set by now.
}
示例2:编译错误

func pickThing2(choice: Bool) {
    let variable: String //Yes, we can fail to provide a value here, but...

    if choice {
        variable = "Thing 1"
    } else {
        //Uh oh, if choice is false, variable will be uninitialized...
    }

    print(variable) //...that's why there's a compilation error. Variables ALWAYS must have a value. You may assume that they always do! The compiler will catch problems like these.
}
示例3:允许零

func pickThing3(choice: Bool) {
    let variable: String? //Optional this time!

    if choice {
        variable = "Thing 1"
    } else {
        variable = nil //Yup, this is allowed.
    }

    print(variable) //This works fine, although if choice is false, it'll print nil.
}

这可能是编译器的一个异常现象,即您没有以这种方式声明变量时出错

class MyClass {}
var myClass : MyClass
但是在操场上,当你仅仅读取变量时,你会得到一个运行时错误

myClass
初始化前使用的变量“myClass”


Swift最基本的特征之一是非可选变量永远不能为零。如果试图访问变量,将出现运行时错误,即崩溃。

请提供完整的代码,包括周围的类定义:您发布的代码将无法编译。@andyvn22您的意思是第三行出现错误吗?我已经修复了代码,但还没有检查。@Altaveron编译器已经为您完成了这项工作。在Swift中,变量不能为零,除非您将其标记为可选。“类变量”是具有特定定义的特定编程术语,该定义不是“类型为类的变量”。如果你不相信我,请阅读苹果的Swift iBook,但你使用的术语“类变量”不正确,这让你的问题的读者感到困惑。最后,
var未初始化:Int
。它是编译的,就像你的类示例一样。只是“变量”:正如我指出的,它们的行为与任何其他类型的变量没有任何不同。没有理由以不同的方式提及它们。您可以轻松地创建未初始化的
Int
:var uninitialized:Int。但是,无论是否为类,您必须在此后不久为变量提供一个值,否则代码将无法编译。如果希望变量在运行时以有效的方式“无值”,则必须将变量声明为可选。您有可能在运行时未初始化的类变量。因此,您必须在使用前进行检查,以防止应用程序崩溃。怎么用?仅将变量更改为optionals?是的,如果您试图允许某个变量在运行时没有值,则必须将该变量声明为可选变量。在没有明确提供初始值的情况下,不能声明非可选变量。保持变量在其声明的确切行上未初始化的功能只是为了在几行之后提供初始值。编译器将不允许您在代码中包含变量,除非提供的值为正值。但是Swift不是类型安全语言。在语言概念上似乎有一个很大的问题。不仅编译器没有检查代码是否安全,甚至开发人员(!)也做不到!除非他在任何情况下都使用optionals来代替变量。我重复一遍:“编译器不会允许您在代码中包含变量,除非提供了一个正值。”这是完全安全的。请在这里尝试并阅读苹果的Swift iBook!感谢您的时间。这不是一个异常:声明变量并在以后提供其初始化是故意有效的,例如,在
开关的不同情况下允许两个不同的初始值。但是,编译器将确保在初始化变量之前不存在允许使用该变量的可能代码执行路径。是。我想防止崩溃来检查类变量。为什么没有办法防止未初始化变量的崩溃?它似乎迫使我们只使用可选的。或者,由于无法检查类变量,您可能会在运行时崩溃。Swift迫使开发人员进行不同的思考,并在设计时处理这些问题…;-)若你们将一个类类型的变量传递给函数编译器并不能帮助你们防止崩溃!!!这是我的问题,我需要检查变量是否在函数体中初始化。我该怎么做?只是重写代码以使用optionals代替变量?是的,编译器确实可以帮助您:它保证除非传递给该函数的变量是可选的,否则它有一个值。不能有没有值的非可选变量。试试看:把上面的
classVariable
传递给函数。编译错误。换句话说,在代码中的任何时候,您都可以假定非可选变量已初始化。总是。编译器将告诉您是否忘记初始化它们。