5 SwiftUI技巧,让你的代码更干净10倍

发布: (2026年2月1日 GMT+8 02:36)
2 min read
原文: Dev.to

Source: Dev.to

1. 创建可复用的 ViewModifier

不要一次又一次地重复相同的修饰符,而是定义一个自定义的 ViewModifier 并通过视图扩展公开它。

struct PrimaryButtonStyle: ViewModifier {
    func body(content: Content) -> some View {
        content
            .font(.headline)
            .foregroundColor(.white)
            .padding()
            .background(Color.blue)
            .cornerRadius(10)
    }
}

extension View {
    func primaryButtonStyle() -> some View {
        modifier(PrimaryButtonStyle())
    }
}

// Usage
Text("Hello")
    .primaryButtonStyle()

2. 即使只使用一次也要抽取子视图

大型视图的主体很难快速阅读。将不同的部分抽取到各自的 View 结构体中。

struct ProfileView: View {
    var body: some View {
        VStack {
            ProfileHeader()
            ProfileStats()
            ProfileActions()
        }
    }
}

3. 使用 @ViewBuilder 处理条件内容

将分支 UI 逻辑封装在带有 @ViewBuilder 标记的计算属性或函数中。

@ViewBuilder
var content: some View {
    if isLoggedIn {
        HomeView()
    } else {
        LoginView()
    }
}

4. 集中管理间距数值

为间距常量定义唯一的真相来源,以保持布局的一致性。

enum Spacing {
    static let xs: CGFloat = 4
    static let sm: CGFloat = 8
    static let md: CGFloat = 16
    static let lg: CGFloat = 24
}

VStack(spacing: Spacing.md) {
    Text("Title")
}

5. 提供完整的预览

在预览画布中展示视图的多种变体,包括暗模式支持。

struct ButtonView_Previews: PreviewProvider {
    static var previews: some View {
        Group {
            ButtonView(title: "Normal")
            ButtonView(title: "Dark")
                .preferredColorScheme(.dark)
        }
    }
}

可直接使用的入门套件

如果你想要一个已经融合这些模式的项目,查看 SwiftUI Starter Kit Pro ——它可以为每个项目节省数十小时的工作时间。

Back to Blog

相关文章

阅读更多 »

[SUI] 搜索栏

NavigationStack 中的搜索栏 NavigationStack 可以通过 `searchable` 修饰符添加搜索栏。它的签名是:swift searchable t...

[SUI] LabeledContent

LabeledContent(https://developer.apple.com/documentation/swiftui/labeledcontent)是一个将标签附加到控件的容器。基本用法示例:swift struct C…

[SUI] 表单 (Form)

Form Form 是一个用于分组控件的容器,主要用于某些功能的配置。它在 List 中呈现控件,并且…

[SUI] 多日期选择器

使用 MultiDatePicker。MultiDatePicker 允许在 SwiftUI 中选择多个日期。Swift 初始化器 MultiDatePicker.init_:selection:in: - titleKey: 标题键。