"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
method
或field
上加上static
就叫做class
field/method
, 这样你就可以无需创建 class
的 instance
即可访问它。
没有 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
此处 conversionRate
与 class CurrencyConverter
而不是 实例 相关联。因此,即使实例 c
超出范围,它也会保留在内存中,即只要应用程序运行。
因此,创建 实例变量 比创建 静态变量 .
更优化
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
method
或field
上加上static
就叫做class
field/method
, 这样你就可以无需创建 class
的 instance
即可访问它。
没有 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
此处 conversionRate
与 class CurrencyConverter
而不是 实例 相关联。因此,即使实例 c
超出范围,它也会保留在内存中,即只要应用程序运行。
因此,创建 实例变量 比创建 静态变量 .
更优化