【问题标题】:What is the different between `if var` and `if let` in swift? [duplicate]swift中的`if var`和`if let`有什么区别? [复制]
【发布时间】:2015-08-12 02:52:57
【问题描述】:

考虑这两个代码:

if let myValue = myObject.value as NSString?{
 //logic here
}

对比

if var myValue = myObject.value as NSString?{
 //logic here
}

我知道 let 关键字是定义一个常量,这是否意味着第一行代码,如果 myObject.value 是 NSString ,则 myValue 常量将被创建?这看起来令人困惑。

【问题讨论】:

标签: swift


【解决方案1】:

您使用let 创建一个常量,因此在第一个示例中您无法更改myValue

当您使用var 时,myValue 是一个变量,您可以在if 语句中更改它。

【讨论】:

    【解决方案2】:

    变量类型会有所不同,具体取决于您使用的是 let 还是 var。

    let 是最终的,之后不能更改。 var 是一个普通变量。

    如果您在此语句中使用 let,您的 myValue 将无法更改或修改。

    【讨论】:

      【解决方案3】:

      你说的例子是可选绑定

      可选绑定用于确定可选是否具有值,如果有,则使该值可用作临时常量变量

      if let myValue = myObject.value as NSString?{
       //logic here
      }
      

      上面的代码将提取myObject.value如果作为常量存在,而下面的代码将提取myObject.value作为变量

      if var myValue = myObject.value as NSString?{
       //logic here
      }
      

      【讨论】:

        【解决方案4】:

        如果您使用let,那么您将无法更改myValue

        if let myValue = myObject.value as NSString? {
            myValue = "Something else" // <-- Compiler error
        }
        

        另一方面,var 你可以。

        if var myValue = myObject.value as NSString? {
            myValue = "Something else" // <-- It's fine
        }
        

        请注意,myValue 确实只存在于if 的范围内,更改其值不会产生超出其范围的影响。

        希望这会有所帮助。

        【讨论】:

        • 你(几乎)最后一句话是错误的。检查swiftstub.com/774222102
        • 在您的示例中,您不会更改 test 的值。您正在将值 referenced 更改为 test。这不一样。我认为我的句子是正确的:如果您更改myValue 的值,您不会产生超出其范围的效果。
        • 不管怎样,你做了一个聪明的观察。我将更新我的答案以包含您的示例。
        • 是的,在 Swift 中,当我们使用 ClassValue Type 时,我们使用 StructEnumTuple。但请注意,这不会改变我的答案。 myValue 可以是类、结构、枚举或类型。如果我在IF(我的意思是我写myValue = something)内改变它的值,效果不会传播到IF之外。
        • 值得指出的是if let myValue = ...不允许你通过myValue更改引用的对象。也就是说,在块内部,myValue.someProperty = aValue 会产生编译器错误,就像尝试分配给 myValue 本身一样。
        【解决方案5】:

        “使用 let 制作常量,使用 var 制作变量。 常量的值不需要在编译时就知道,但你必须给它赋值一次。

        这意味着您可以使用常量来命名您确定一次但在许多地方使用的值。

         var myVariable = 42
         myVariable = 50
         let myConstant = 42
        

        常量或变量必须与您要分配给它的值具有相同的类型。

        但是,您不必总是显式地编写类型。在创建常量或变量时提供值可以让编译器推断其类型。

        在上面的例子中,编译器推断 myVariable 是一个整数,因为它的初始值是一个整数。

        阅读:iBook Swift 编程语言

        谢谢。

        【讨论】:

          猜你喜欢
          • 2019-06-25
          • 2014-07-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-07-21
          相关资源
          最近更新 更多