【问题标题】:Why doesn't redeclaration of 'optional binding' create an error?为什么重新声明“可选绑定”不会产生错误?
【发布时间】:2016-08-29 22:06:41
【问题描述】:

我在 Playground 中执行此操作,但没有收到任何错误。我不是在重新创建常量range 吗?它发生在 2 个不同的范围内吗?后台发生了什么导致此不是错误?

if let range = add1.rangeOfString(", ") {
    print(add1.substringToIndex(range.startIndex))
    print (range)
}

if let range = add1.rangeOfString(", ") {
    print(add1.substringToIndex(range.startIndex))
    print (range)
}

【问题讨论】:

  • 条件绑定使您能够应用强制转换,测试生成的可选值,然后将展开的值绑定到局部变量。见here

标签: swift compiler-errors optional


【解决方案1】:

通过if-let 的可选绑定引入的变量在let 子句之后是本地的,直到真实案例代码块的末尾。

所以,是的。您的两个range 驻留在两个不同的范围内

guard-let 是另一回事。)

【讨论】:

  • 1) 你能解释一下为什么它是这样创建的吗?我在 Apple 文档中找不到任何内容。这背后的机制是什么? 2) 就像一个切题的问题一样。 {} 中的语句基本上是完成处理程序吗?
  • @Honey, 1) if-let 是非零检查和声明非零(未包装)变量的组合。类似于if something != nil {let unwrappedSomething = something!;...} 的东西。引入的变量应该在something != nil 的上下文中。但是,这是真的,Apple 的文档缺乏对 Swift 的许多重要特性的详细描述。
  • @Honey, 2) {}ifwhiledo... 绑定的符号称为“代码块”。它捆绑了一些可执行语句,还为局部变量引入了新的作用域。 {} 在“表达式”的上下文中称为“闭包表达式”(或“闭包文字”,许多人简称为“闭包”),您称之为“完成处理程序”。 “闭包”可以存储在变量中,传递给方法,但“代码块”是一种语法,不能与if(或其他一些)分开。
  • 谢谢。我知道非零和(几个月后终于理解)关闭 sytanx 这让我注意到{},但你的澄清让它变得更好。
  • 在 Swift 中,代码块中的局部声明可以“隐藏”外部声明。例如,do {let a = 1; do {let a = "c"; do {let a = 0..<2}}} 是有效的。可选绑定是一种隐藏块,因此您可以隐藏声明。
猜你喜欢
  • 1970-01-01
  • 2020-04-20
  • 2017-05-23
  • 2013-09-04
  • 1970-01-01
  • 2013-05-01
  • 2011-03-04
  • 2017-01-29
  • 1970-01-01
相关资源
最近更新 更多