"static let" vs "let" 用于声明 class 特定常量

"static let" vs "let" for declaring class specific constants

class CurrencyConverter {

    // 1
    private let conversionRate = 1.3 

    // 2
    private static let conversionRate = 1.3

    func convertToForeign(fromlocal local: Double) -> Double {
        return local * CurrencyConverter.conversionRate
    }
}

let c = CurrencyConverter()
print(c.convertToForeign(fromlocal: 5))

参考上面的代码片段,假设我只需要在实例方法中使用常量conversionRate

conversionRate 声明为仅 (1)let 与 (2)static let 的优缺点是什么?

哪种样式更具可读性和优化性?

此外,假设我只需要 CurrencyConverter 的 1 个短暂实例,而 conversionRate 本身很庞大(10K 双精度数组)。 (1)let conversionRate 是否会优化内存?

如果你在class methodfield 上加上static 就叫做class field/method, 这样你就可以无需创建 classinstance 即可访问它。

没有 static 关键字, field/method 将是 instance field/method ,这只能通过创建 class.[= 的实例来访问24=]

在这种情况下,最好使用 static 字段,因为它不依赖于其他 class fields/methods,而且如果您有许多相同的 [=30] 对象,它的内存效率更高=].

都没有。使用一个无人居住的(无大小写)enum创建一个Constant命名空间;它读起来更好。

class CurrencyConverter {
    private enum Constant {
        static let conversionRate = 1.3
    }
    func convertToForeign(fromlocal local: Double) -> Double {
        return local * Constant.conversionRate
    }
}

let c = CurrencyConverter()
print(c.convertToForeign(fromlocal: 5))

在下面的代码中,

private let conversionRate = 1.3

上面是一个实例变量,即只要CurrencyConverter(c)的实例存在,它就会一直存在。一旦 c 超出范围,conversionRate's 范围也将结束。

然而,在下面的代码中

private static let conversionRate = 1.3

此处 conversionRateclass CurrencyConverter 而不是 实例 相关联。因此,即使实例 c 超出范围,它也会保留在内存中,即只要应用程序运行。

因此,创建 实例变量 比创建 静态变量 .

更优化