【发布时间】:2019-02-01 17:13:44
【问题描述】:
我正在使用静态结构来命名我的应用程序的常量。实际上,它们不是常量而是变量,所以以后用户可以更改其中的一些。
其中很多是依赖于字体大小的指标,因此嵌套在结构中的是另一个结构,它保存相对于字体大小的所需大小,但每当应用程序访问其中一个常量时,最终值计算出来的。
这是一个小代码示例:
public struct ApplicationConstants {
public static var fontSize: Double = 24
public struct RelativeSize {
public var size: Double
public init(_ size: Double) {
self.size = size
}
public var double: Double {
return size * fontSize
}
}
public static var offsetAfterBulletPoint: RelativeSize = RelativeSize(0.3)
}
print(ApplicationConstants.offsetAfterBulletPoint.double) // returns 7.2
ApplicationConstants.fontSize = 16
print(ApplicationConstants.offsetAfterBulletPoint.double) // returns 4.8
为了更好的可读性,我更喜欢直接访问结果值而无需显式调用 .double 计算属性,如下所示:
print(ApplicationConstants.offsetAfterBulletPoint)
因为这个值是应用程序本身需要的唯一值。存储的相对于字体大小的值仅用于显示在可能的首选项窗格中,其中与字体大小的关系比结果值更容易理解。
我可以将值直接存储为双精度值并在初始化时进行计算:
public static var offsetAfterBulletPoint: Double = fontSize*0.3
但是我必须在 fontSize var 中实现一个 willSet 观察器,以便在字体大小发生变化时重新计算每个单独的字体相关值。在我的应用中,可能会有 100 多个这样的字体相关值。
那么,是否有协议或其他东西,它可以使我嵌套的 RelativeSize 结构的 .double var 成为一种“第一响应属性”,在调用变量而不指定成员时将返回该属性,以便它的行为如果它是原始的?
【问题讨论】:
-
我建议不要在这种情况下使用静力学。我保证你会遇到这样一种情况,你要两个想要两个
ApplicationConstants,具有不同的值。 -
你需要内部结构吗?您可以将所有这些变量都设置为静态变量。
标签: swift properties