【问题标题】:Using "let" inside Struct - Swift在 Struct 中使用“let” - Swift
【发布时间】:2014-08-17 11:19:20
【问题描述】:

我目前正在练习 Swift Language iBook 中的示例。我对“让”的理解是我们用“让”来做一个常数。一旦我们给它赋值,我们就不能再给它赋值。喜欢下面的代码:

let city="NY"
city="LA"  <--error (Cannot assign 'let' value city)

但我在 iBook 上看到了这个例子,这让我很困惑:

struct Color{
let red=0.0, green=0.0, blue=0.0  //<---declare variables using "let" and assign value
init(red:Double,green:Double,blue:Double){
    self.red=red                  //<---assign value to variable again?
    self.green=green               
    self.blue=blue                
    }
}

在此示例中,它已经为使用“let”的红色、绿色和蓝色分配了值。

为什么我们可以在init中再次给这三个变量赋值?

【问题讨论】:

  • 请注意,这在 Swift 1.2 中不再可能。

标签: swift


【解决方案1】:

let 中的初始化提供默认值,如果您不在构造函数中自己初始化它们。 构造函数 (init) 很特殊。在它们内部,您可以分配给一个常量实例变量。事实上,如果您没有它们的默认值,您必须分配给它们。 (这也适用于类。)

感谢 Qwerty Bob 在文档中找到此内容

在初始化期间修改常量属性

您可以在初始化期间的任何时候修改常量属性的值,只要在初始化完成时将其设置为确定的值。

摘自:Apple Inc. “Swift 编程语言”。电子书。 https://itun.es/us/jEUH0.l

【讨论】:

【解决方案2】:

您可以在初始化过程中,在使用 self 关键字之前设置常量变量。在此之后,它们才是真正的“恒定”。

您必须在使用 self 关键字之前执行此操作,就好像您将它传递给另一个对象一样,它可以反过来调用您的依赖于该常量属性的方法

【讨论】:

    【解决方案3】:

    另外:结构是通过值而不是通过引用传递的,所以你不能在设置后修改结构中的变量。所以 let 关键字真的很有意义。

    【讨论】:

      【解决方案4】:

      如果您在书中给出的示例之后继续阅读几段(除非他们在多个位置使用它),它实际上谈到了这种行为:

      你可以在任何时候修改常量属性的值 初始化,只要设置成一个确定的值 初始化完成。

      所以基本上你可以修改常量,并且在结束初始化时,所有常量都必须有一个确定的值。它还继续讨论它如何与子类一起工作:

      对于类实例,一个常量属性只能在 由引入它的类初始化。无法修改 通过子类。

      这里是它的doc reference(与本书相同),引用的部分在“初始化期间修改常量属性”子标题下。

      【讨论】:

        【解决方案5】:

        除了 Kevin 回答的初始化部分之外,您仍然缺少 let 的常量部分。所以澄清一下 let 并不完全是一个常数。

        根据“Swift 编程语言”。苹果公司,2014-05-27T07:00:00Z。 iBooks:

        与 C 一样,Swift 使用变量来存储和引用值 识别名称。 Swift 还广泛使用了变量 值不能更改。这些被称为常数,并且很多 比 C 中的常量更强大。

        varlet 都是引用,因此letconst 引用。 使用基本类型并不能真正显示letconst 的不同之处。 将它与类实例(引用类型)一起使用时会有所不同:

        class CTest
        {
            var str : String = ""
        }
        
        let letTest = CTest()
        letTest.str = "test" // OK
        
        letTest.str = "another test" // Still OK
        
        //letTest = CTest() // Error
        
        var varTest1 = CTest()
        var varTest2 = CTest()
        var varTest3 = CTest()
        
        varTest1.str = "var 1"
        varTest2.str = "var 2"
        varTest3 = varTest1
        varTest1.str = "var 3"
        
        varTest3.str // "var 3"
        

        【讨论】:

          猜你喜欢
          • 2016-12-10
          • 2015-06-22
          • 2016-03-11
          • 1970-01-01
          • 2022-01-17
          • 1970-01-01
          • 1970-01-01
          • 2016-10-07
          • 1970-01-01
          相关资源
          最近更新 更多