You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在SwiftUI Picker中遍历Font.Design枚举值实现字体样式选择

解决方案

核心原因是系统内置的Font.Design未默认遵守CaseIterable协议,无法直接被ForEach遍历,我们手动扩展遵守协议即可实现需求:

步骤1:扩展Font.Design添加协议支持

import SwiftUI

extension Font.Design: CaseIterable {
    // 手动返回所有枚举值,当前系统仅提供4种
    public static var allCases: [Font.Design] {
        [.default, .monospaced, .rounded, .serif]
    }
    
    // 可选:自定义显示名称,避免关键字`default`显示异常
    var displayName: String {
        switch self {
        case .default: return "默认"
        case .monospaced: return "等宽"
        case .rounded: return "圆角"
        case .serif: return "衬线"
        }
    }
}

步骤2:修改Picker实现代码

把ForEach的参数改为Font.Design.allCases,文本内容使用自定义的displayName即可:

Picker("字体设计", selection: $vm.fontDesign) {
    ForEach(Font.Design.allCases, id: \.self) { design in
        Text(design.displayName)
            .tag(design)
    }
}

效果验证

选择后可通过如下代码测试字体样式是否生效:

Text("测试字体效果")
    .font(.system(size: 18, design: vm.fontDesign))

内容的提问来源于stack exchange,提问作者neovision

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 12:36:05