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.
相关产品推荐
相关产品推荐

