【问题标题】:Swift constant that depends on another constant依赖于另一个常量的 Swift 常量
【发布时间】:2015-08-02 05:03:09
【问题描述】:

我正在尝试通过以下方式创建一个依赖于另一个常量的常量:

class Thingy {
 let paddingConstant = 13.0
 let paddingDict = ["padding": paddingConstant]
}

底线给了我一个错误"Thingy.Type does not have a member named 'paddingConstant'"

是否可以声明一个依赖于另一个的常量?

【问题讨论】:

标签: ios swift constants


【解决方案1】:

是的,这是可能的。您需要将 paddingDict 设为只读计算属性

class Thingy {

    let paddingConstant = 13.0

    var paddingDict : [String : Double] {

        get {return ["padding": paddingConstant] }
    }
}

【讨论】:

  • 但是这会在每次使用 paddingDict 时创建一个字典
  • 不,它不会在每次使用时创建字典,但会在每次使用时计算其值,并且由于您的 paddingDice 使用另一个属性来计算其值,因此它应该是计算属性。你可以在这里了解更多关于计算属性的信息developer.apple.com/library/ios/documentation/Swift/Conceptual/…
  • @zellb 您能说明一下在哪里明确说明了吗?如果每次都计算属性,那么计算的一个步骤就是创建字典。
  • 创建新实例意味着分配一些内存。计算属性只分配一次内存,并将该内存仅用于进一步计算,这会产生影响
  • @zellb 然后也可以用'let'声明它,这更合理地表示一次性内存分配。但是计算属性的性质会发生变化,它如何准确地知道是否需要进一步计算?
【解决方案2】:

您可以将 paddingDict 移动到 init:

class Thingy {
    let paddingConstant = 13.0
    let paddingDict : [String: Double]
    init() {
        paddingDict = ["padding": paddingConstant]
    }
}

【讨论】:

  • 不能给 viewDidLoad 中的常量赋值
  • 除了viewDidLoad 部分,这是正确的。
  • 好的,谢谢,伙计们。我会删除那部分! (我显然在考虑变量)。
  • 那么如果你有多个指定的初始化器,你就无法避免重复代码。
【解决方案3】:

另一种解决方案是声明这个变量lazy。优点是,与计算属性不同,它不会在每次获取其值时都执行计算;但缺点是它不能是一个常数,不幸的是:

class Thingy {
    let paddingConstant = 13.0
    lazy var paddingDict : [String:Double] = 
        ["padding": self.paddingConstant]
}

我认为这种限制是 Swift 语言中的一个错误。

【讨论】:

    【解决方案4】:

    作为另一种解决方案,您可以使用外部结构来定义常量(以及您可能需要的其他常量):

    struct Constants {
        static let paddingConstant = 13.0
    }
    

    然后在Thingy类中使用:

    class Thingy {
      let paddingDict = ["padding": Constants.paddingConstant]
    }
    

    【讨论】:

      【解决方案5】:

      如果b 定义为static,您可以使用另一个constant property b 的值填充instance constant property a(在定义时)。

      class Thingy {
          static let paddingConstant = 13.0
          let paddingDict = ["padding": paddingConstant]
      }
      

      这是您收到的错误消息的直接答案:

      Thingy.Type 没有名为“paddingConstant”的成员

      实际上,通过将paddingConstant 设为静态,它变成了Type propertyThingy.Type 的一部分。

      希望这会有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-03-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多