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

SwiftUI如何遍历UnitPoint这类内置结构体的所有属性?

遍历UnitPoint所有预定义锚点的解决方案

你遇到的Mirror返回空数组的问题,本质是UnitPoint的预定义锚点(如.topLeading、.bottom)都是计算属性,而非存储属性,Mirror只能反射类型的存储属性,所以无法通过它获取这些预定义值。

要实现遍历所有预定义锚点,最可靠的方式是手动整理所有官方提供的UnitPoint实例,下面是两种可行的实现方案:

方案1:直接使用元组数组存储锚点与名称

直接创建包含锚点实例和对应显示名称的数组,在Picker中遍历:

struct AnchorPicker: View {
    
    @State private var selectedAnchor: UnitPoint = .topLeading
    
    // 整理所有预定义UnitPoint锚点及对应显示名称
    private let unitPointOptions: [(anchor: UnitPoint, displayName: String)] = [
        (.topLeading, "Top Leading"),
        (.top, "Top"),
        (.topTrailing, "Top Trailing"),
        (.leading, "Leading"),
        (.center, "Center"),
        (.trailing, "Trailing"),
        (.bottomLeading, "Bottom Leading"),
        (.bottom, "Bottom"),
        (.bottomTrailing, "Bottom Trailing")
    ]
    
    var body: some View {
        Picker(selection: $selectedAnchor) {
            ForEach(unitPointOptions, id: \.anchor) { option in
                Text(option.displayName).tag(option.anchor)
            }
        } label: {
            Text("Select an anchor")
        }
    }
}

#Preview("Anchor Picker") {
    AnchorPicker()
}

方案2:给UnitPoint扩展静态数组与显示名称

通过扩展让UnitPoint拥有类似枚举的allCases静态属性,同时添加displayName属性统一处理文本显示,代码更优雅:

extension UnitPoint {
    // 所有预定义锚点的静态数组
    static let allCases: [UnitPoint] = [
        .topLeading, .top, .topTrailing,
        .leading, .center, .trailing,
        .bottomLeading, .bottom, .bottomTrailing
    ]
    
    // 对应锚点的友好显示名称
    var displayName: String {
        switch self {
        case .topLeading: return "Top Leading"
        case .top: return "Top"
        case .topTrailing: return "Top Trailing"
        case .leading: return "Leading"
        case .center: return "Center"
        case .trailing: return "Trailing"
        case .bottomLeading: return "Bottom Leading"
        case .bottom: return "Bottom"
        case .bottomTrailing: return "Bottom Trailing"
        default: return "Custom Anchor" // 处理自定义UnitPoint的情况
        }
    }
}

struct AnchorPicker: View {
    
    @State private var selectedAnchor: UnitPoint = .topLeading
    
    var body: some View {
        Picker(selection: $selectedAnchor) {
            ForEach(UnitPoint.allCases, id: \.self) { anchor in
                Text(anchor.displayName).tag(anchor)
            }
        } label: {
            Text("Select an anchor")
        }
    }
}

#Preview("Anchor Picker") {
    AnchorPicker()
}

说明

苹果官方为UnitPoint提供的预定义锚点是固定的(共9个),手动整理的方式不会遗漏,且避免了反射带来的不确定性。如果后续苹果新增了预定义锚点,只需要更新数组或switch分支即可。

内容的提问来源于stack exchange,提问作者Andrei G.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 10:25:07