Swift 打印一个nil对象,编译器说;未解析标识符“;后面发生了什么?

Swift 打印一个nil对象,编译器说;未解析标识符“;后面发生了什么?,swift,null,optional-binding,Swift,Null,Optional Binding,我尝试了以下代码,但出现了一个错误 var possibleNumber = "Hello World!" if let actualNumber: Int = Int(possibleNumber) { print("\"\(possibleNumber)\" has an integer value of \(actualNumber)") } else { print("\"\(possibleNumber)\" could not be converted to an

我尝试了以下代码,但出现了一个错误

var possibleNumber = "Hello World!"

if let actualNumber: Int = Int(possibleNumber) {
    print("\"\(possibleNumber)\" has an integer value of \(actualNumber)")
} else {
    print("\"\(possibleNumber)\" could not be converted to an integer")
}

print(actualNumber) // **Here comes the compile time error**
错误:

use of unresolved identifier 'actualNumber'
对象实际编号后面发生了什么?我在可选绑定的第一部分声明了它:“如果让actualNumber:Int…”,那么为什么它是“未解析的”?六羟甲基三聚氰胺六甲醚。。。“未解决”这到底是什么

我猜打印一个零是错误的,但为什么它是错误的呢?我不知道。有人能再解释一下吗?顺便问一下,实际数字中真的有零吗?如果是这样,我如何才能“看到”它

//如果发生以下情况,则无法访问外部的实际编号


和Int(“dd”)它将返回nil或可选值。

如果范围:

if let actualNumber = Int(possibleNumber) {
    // Here the 'actualNumber' can be accessed because is in scope
} else {
    // Here the 'actualNumber' cannot be accessed because is not in scope 
}
保护范围

guard let actualNumber = Int(possibleNumber) else {
    // actualNumber cannot be accessed
    // print(actualNumber)
    return
}

// actualNumber can be accessed
print(actualNumber)
但是如果您想要可选值,您可以这样做

let possibleNumber = "Hello World!"
// actualNumber will be optional (and in this case will be 'nil')
let actualNumber = Int(possibleNumber)

print(actualNumber)

您在if语句中有条件地声明变量,并希望在if语句之外使用它。这行不通。首先,您可以使用条件链接,其中实际编号仅会被初始化为可能的Enumber不为零。如果possibleNumber为零,则实际编号将不存在

其次,在if语句中声明的常量(或变量)仅在该if语句中具有作用域。这意味着,当您试图访问该常量时,编译器会告诉您该常量不存在,“未声明的变量”,这是您使用最后一条if语句执行的操作


可选链接由apple on解释。

实际编号仅存在于aka中定义的
if
范围内。在if之外,它根本不存在,编译器无法解析名称,因为在该范围内没有定义关联的变量。@luk2302现在,我已将else部分的主体更改为print(actualNumber)仍然是saids“unresolved…”,这意味着它仍然在“if”的范围之外。我假设您正在使用示例代码。如果您继续往下读一点,您会看到它说“在If语句中使用可选绑定创建的常量和变量仅在If语句体中可用。”。您可以使用guard语句在语句范围之外使用可选绑定变量。解决方案:根据
if
分支内的
actualNumber
移动所有内容。变量也没有在
else
分支中定义-它应该有什么值?您可以在if语句中有条件地绑定它,如果存在值,则执行if主体,如果不存在,则执行else主体,并且变量不可用。如果要在检查后使用actualNumber,则可以使用
guard let
。“如果可能的Enumber为零,则actualNumber将不存在”这意味着如果可能枚举数为零,则acturalNumber甚至没有被清除,清除acturalNumber的前提条件是Int(可能枚举数)返回一个整数。正确。我在回答中添加了一个苹果解释的可选链接。谢谢,现在我开始了解Gard scope的含义。是的,你说得对,现在我从你的帮助中开始了解scope的含义,非常感谢
let possibleNumber = "Hello World!"
// actualNumber will be optional (and in this case will be 'nil')
let actualNumber = Int(possibleNumber)

print(actualNumber)