if let variable - 使用未解析的标识符

Posted

技术标签:

【中文标题】if let variable - 使用未解析的标识符【英文标题】:if let variable - Use of unresolved identifier 【发布时间】:2015-07-03 11:17:51 【问题描述】:

我正在使用 SwiftyJSON 调用一些 API 并获取一些数据。 当我使用时:

if let variable = json["response"]["fieldname"] 
 else 
    println("error")

我稍后无法使用该变量,例如将值附加到数组。 例如:

if let variable1 = json["response"]["fieldname1"] 
 else 
    println("error")

if let variable2 = json["response"]["fieldname2"] 
 else 
    println("error")

var currentRecord = structure(variable1, variable2)    ---> This line returns an error (use of unresolved identifier variable1) as not able to find variable1 or variable2
myArray.append(currentRecord)

我该如何解决这个问题?

【问题讨论】:

【参考方案1】:

if let 的范围在紧随其后的括号内:

if let jo = joseph 
  // Here, jo is in scope
 else 
  // Here, not in scope

// also not in scope
// So, any code I have here that relies on jo will not work

在 Swift 2 中,添加了一个新语句 guard,它似乎具有您想要的那种行为:

guard let jo = joseph else  // do something here 
// jo is in scope

但是,如果您被困在 Swift 1 中,那么您可以轻松地解开这些变量而不用陷入厄运金字塔:

if let variable1 = json["response"]["fieldname1"], variable2 = json["response"]["fieldname2"] 
  var currentRecord = structure(variable1, variable2)
  myArray.append(currentRecord)
 else 
  println("error")

【讨论】:

谢谢,我将使用 Swift 1 的解决方案。即使我不乐意​​这样做,因为某些变量可能需要为空【参考方案2】:

@oisdk 已经解释了由if let 定义的变量的范围仅在该语句的大括号内。

这就是你想要的,因为如果 if let 语句失败,则变量未定义。 if let 的全部意义在于安全地解开您的可选项,以便在大括号内,您可以确定变量是有效的。

另一个解决问题的方法(在 Swift 1.2 中)是使用多个 if let 语句:

if let variable1 = json["response"]["fieldname1"],
  let variable2 = json["response"]["fieldname2"] 

  //This code will only run if both variable1 and variable 2 are valid.
  var currentRecord = structure(variable1, variable2)  
  myArray.append(currentRecord) 
else 

    println("error")

【讨论】:

谢谢,我将使用 oisdk 提出的解决方案,但我仍然认为有更好的解决方案,因为某些变量可能需要为空【参考方案3】:

即使变量 1 失败,您的代码也会始终检查变量 2。 导致(已编辑!)不是错误。

您可以在同一行中检查和分配两个变量。只有当两个变量都不为零时,才会执行“true”分支

let response = json["response"]
if let variable1 = response["fieldname1"],  variable2 = response["fieldname2"] 
  let currentRecord = structure(variable1, variable2)
  myArray.append(currentRecord)
 else 
  println("error")

【讨论】:

检查 variable2 不会导致错误 - 检查中没有任何内容依赖于 variable1。它应该可以正常工作。错误是在其范围之外使用这两个变量。

以上是关于if let variable - 使用未解析的标识符的主要内容,如果未能解决你的问题,请参考以下文章

在 if 语句中静默 -Wunused-variable

如何让语句识别未定义的变量? [复制]

解决 Let’s Encrypt SSL 证书配置错误

在 if 语句中声明变量时使用未解析的标识符

What's the difference between using “let” and “var” to declare a variable in JavaScript?

Firebase Cloud Functions TS - 未解析的函数/变量/方法