问题描述
在我的 SwiftUI 应用程序中,我目前使用的是一个全局结构,该结构包含诸如颜色或大小之类的常量属性。 例如
struct App {
struct Colors {
static let mainAppColor: UIColor = UIColor(red: 233/255,green: 230/255,blue: 231/255)
static let mainWhiteColorMiddleOpacity: UIColor = UIColor.white.opacity(0.5)
}
}
// usage
struct ContentView: View {
var body: some View {
Rectangle().foregroundColor(App.Colors.mainBlueColor)
}
}
我一直在争论这是否是一种不好的做法,因为我有很多静态变量,并且想知道用静态方法或计算属性替换它们是否会减少内存使用量(因为 body 被计算了很多次)。例如。替换:
struct App {
struct Colors {
static var mainBlueColor: UIColor { UIColor.blue }
static var mainWhiteColorMiddleOpacity: UIColor { UIColor.white.opacity(0.5) }
}
}
// usage
struct ContentView: View {
var body: some View {
Rectangle().foregroundColor(App.Colors.mainBlueColor)
}
}
一个会增加堆使用量,另一个会增加堆栈使用量,对吗? 您认为最佳做法是什么?
解决方法
计算属性仅在需要计算的情况下才有用,因此 var
iable 有意义。
您肯定是在创建常量(正如您所提到的),因此请使用 let
关于内存使用:如何在资产目录中声明颜色?
,过早(且考虑不周)的优化。您可能不知道,从宏观的角度来看,即使是数千个这样的值实际上占用的内存也很少;这是微不足道的。任何编写得体的应用都会有很多这样的应用;这就是你所做的。
结构是组织和命名此类事物的好方法,尽管现在 Apple 更喜欢使用枚举(出于我不完全理解的原因)。
你的“因为身体被计算了很多次”是完全不相关的:这个名字是对值的直接引用,绝对没有开销,因为如果你使用 let
整个事情被编译掉并被替换为值就在代码中的引用点。运行时的查找时间为零!
(另一方面,计算值或方法可能每次都需要一些严重的开销来运行,这可能会使整个消息分发机制发挥作用,尽管它实际上可能被内联掉了。在那里严重倒退。)
,我会说永远不要将计算属性用于您已经知道答案或值的事情,从另一方面来说,您知道 SwiftUI 会运行多少次计算属性来使用它吗?这么多运行代码以获得相同的东西!
你可以在你的应用程序中使用计算属性来获取你需要的东西,只是为了读取值,例如你有一个知道宽度和高度的矩形,然后使用计算属性来获取面积,或者其他东西类似这样,读完value你也就完成了,也不需要存储了。