SwiftUI 中更好的性能:创建新视图或使用带有@ViewBuilder 的函数
Better Performance in SwiftUI: Creating a new view OR using a function with @ViewBuilder
在 Swift 中处理不同的视图组合时UI,我们可以采用两种方法:
- 在视图中使用一些@ViewBuilder 函数作为辅助函数:
@ViewBuilder func makeButtonLabel() -> some View {
if isPlaying {
PauseIcon()
} else {
PlayIcon()
}
}
- 要为 UI 作品创建不同的视图:
struct SongRow: View {
var song: Song
@Binding var isPlaying: Bool
...
var body: some View {
HStack {
if isPlaying {
PauseIcon()
} else {
PlayIcon()
}
}
}
}
我想知道哪个更好,我们如何衡量它?
从分析上看,我觉得第二个在更大的视图块中表现更好,尤其是我们可以在预览的加载时间看到它,但我没有任何线索。
您可以假设性能差异可以忽略不计(如果有的话)。 struct
的重量很轻 - 选择在您的上下文中最有意义的那个。此外,您不需要第二个示例中的 HStack
,因为 body
隐含地是 @ViewBuilder
.
最后,这两者都不比另一个好,因为没有可衡量的影响。
通常,我更喜欢拆分越来越大的视图,或者将更有意义的视图作为自己的视图。例如:
如果您的视图组件严重依赖当前结构实例中的属性,您可以创建一个新的 @ViewBuilder var buttonLabel: some View
/@ViewBuilder func makeButtonLabel() -> some View
并轻松访问相同的组件属性。
如果属性不相关,将其拆分为单独的视图。这样做还可以更轻松地在应用程序中重用,并且 运行 在 SwiftUI 预览中。
在 Swift 中处理不同的视图组合时UI,我们可以采用两种方法:
- 在视图中使用一些@ViewBuilder 函数作为辅助函数:
@ViewBuilder func makeButtonLabel() -> some View {
if isPlaying {
PauseIcon()
} else {
PlayIcon()
}
}
- 要为 UI 作品创建不同的视图:
struct SongRow: View {
var song: Song
@Binding var isPlaying: Bool
...
var body: some View {
HStack {
if isPlaying {
PauseIcon()
} else {
PlayIcon()
}
}
}
}
我想知道哪个更好,我们如何衡量它?
从分析上看,我觉得第二个在更大的视图块中表现更好,尤其是我们可以在预览的加载时间看到它,但我没有任何线索。
您可以假设性能差异可以忽略不计(如果有的话)。 struct
的重量很轻 - 选择在您的上下文中最有意义的那个。此外,您不需要第二个示例中的 HStack
,因为 body
隐含地是 @ViewBuilder
.
最后,这两者都不比另一个好,因为没有可衡量的影响。
通常,我更喜欢拆分越来越大的视图,或者将更有意义的视图作为自己的视图。例如:
如果您的视图组件严重依赖当前结构实例中的属性,您可以创建一个新的
@ViewBuilder var buttonLabel: some View
/@ViewBuilder func makeButtonLabel() -> some View
并轻松访问相同的组件属性。如果属性不相关,将其拆分为单独的视图。这样做还可以更轻松地在应用程序中重用,并且 运行 在 SwiftUI 预览中。