打印一个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
VC6 编译错误error LNK2001: unresolved external symbol "public: virtual struct