静态变量与存储属性的方法



在我的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)
}
}

我正在争论这是否是一个坏的做法,因为我有很多静态变量,并想知道如果用静态方法或计算属性替换它们会减少内存使用(因为身体得到计算很多次)。如更换:

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)
}
}

一个会增加堆使用,另一个会增加堆栈使用,对吗?你认为最好的做法是什么?

不成熟(且考虑不周)的优化。你可能不知道,即使是成千上万个这样的值,实际上占用的内存是多么少;这是微不足道的。任何写得不错的应用程序都会有很多;这是你该做的。

结构体是组织和命名这类东西的好方法,尽管碰巧enum现在是Apple首选的方法(原因我不完全理解)。

你的"since body"被计算了很多次。是完全不相关的:名称是对值的直接引用,绝对没有开销,因为如果使用let,整个东西都被编译掉,并在代码中的引用点被值替换。运行时的查找时间为零!

(另一方面,计算值或方法每次运行时可能需要一些严重的开销,可能会使整个消息分派机制发挥作用,尽管它实际上可能是内联的。严重的倒退。)

计算属性只有在需要计算的情况下才有用,所以var表是有意义的。

你肯定是在创建常量(正如你提到的),所以使用let

关于内存使用:如何在资产目录中声明颜色?

我会说永远不要使用计算属性的东西,你已经知道的答案或值,从另一边你知道多少次会SwiftUI运行的计算属性使用它?这么多运行代码来获得相同的东西!

你可以在你的应用程序中使用一次或几次你需要的东西来读取值,例如你有一个矩形,你知道它的宽度和高度,然后使用计算属性来获取面积,或者类似的东西,读取值之后你也会完成这些,也不需要存储它。

相关内容

  • 没有找到相关文章

最新更新