Swift 依赖于另一个常量的常量

Swift constant that depends on another constant

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

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

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

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

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

class Thingy {

    let paddingConstant = 13.0

    var paddingDict : [String : Double] {

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

你可以将 paddingDict 移动到 init:

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

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

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

我认为该限制是 Swift 语言中的错误。

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

struct Constants {
    static let paddingConstant = 13.0
}

然后在Thingy中使用class:

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

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

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

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

Thingy.Type does not have a member named 'paddingConstant'

事实上,通过使 paddingConstant 静态化,它变成了 Type property: Thingy.Type 的一部分。

希望对您有所帮助。