打印一个nil对象编译器说“unresolved identifier”后面发生了啥?

Posted

技术标签:

【中文标题】打印一个nil对象编译器说“unresolved identifier”后面发生了啥?【英文标题】:Print a nil object compiler said "unresolved identifier" What happened behind?打印一个nil对象编译器说“unresolved identifier”后面发生了什么? 【发布时间】:2016-04-28 10:25:02 【问题描述】:

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

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 对象背后发生了什么?我在可选绑定的第一部分声明了它:“if let actualNumber: Int .....”那为什么它“未解决”?嗯……“未解决”到底是什么?

我猜打印一个 nil 是错误的,但为什么它是错误的?我不知道。有人可以解释一下吗?顺便说一句,actualNumber 里面真的是零吗?如果是这样,我怎样才能“看到”它?

【问题讨论】:

actualNumber 仅存在于它定义的范围内,也就是 if 的范围内。在 if 它根本不存在之外,编译器无法解析名称,因为在该范围内没有定义关联变量。 @luk2302 现在,我已将 else 部分的正文更改为 print(actualNumber) 仍然说“未解决....”这意味着它仍在“如果”的范围之外 我假设您使用的是示例代码from the docs on optional binding。如果您继续阅读下去,您会看到它说“在 if 语句中使用可选绑定创建的常量和变量仅在 if 语句的主体中可用。”。您可以使用保护语句在语句范围之外使用可选的绑定变量。 解决方案:根据 if 分支内的 actualNumber 移动所有内容。该变量也没有在else 分支中定义——它应该有什么值?你有条件地将它绑定在 if 语句中,如果存在值,则执行 if 主体,如果没有,则执行 else 主体并且变量不可用。 如果你想在检查后使用actualNumber,可以使用guard let 【参考方案1】:

您有条件地在 if 语句中声明一个变量,并希望在 if 语句之外使用它。这行不通。首先,您使用条件链接,其中您的 actualNumber 将被初始化,而 possibleNumber 不为零。如果 possibleNumber 为 nil,actualNumber 将不存在。

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

Apple 在this site 上解释了可选链接。

【讨论】:

“如果 possibleNumber 为 nil,actualNumber 将不存在”是指如果 possibleNumber 为 nil,acturalNumber 甚至不会被清除,清除 acturalNumber 的前提是 Int(possibleNumber) 返回一个 Int号码。 正确。我在答案中添加了一个指向苹果解释的可选链接的链接。【参考方案2】:
you should do something like this :

if let actualNumber = Int(possibleNumber) 
// do something with your number
print("\"\(possibleNumber)\" has an integer value of \(actualNumber)")
 else 
print("\"\(possibleNumber)\" could not be converted to an integer")

//如果

,你不能在外面访问actualNumber

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

【讨论】:

是的,你是对的,现在我开始知道范围的含义是在你的帮助下,非常感谢【参考方案3】:

如果范围:

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)

【讨论】:

谢谢,现在我开始知道 Gard 范围是什么意思了。

以上是关于打印一个nil对象编译器说“unresolved identifier”后面发生了啥?的主要内容,如果未能解决你的问题,请参考以下文章

Kotlin的编译提示:Unresolved reference: xxx

MFC 编译链接错误:unresolved external symbol

编译错误,如何解决error LNK2001: unresolved external symbol

Go中的nil检测

VC6 编译错误error LNK2001: unresolved external symbol "public: virtual struct

对服务器的 POST 请求后,用户对象包含 nil