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

如何在SwiftUI的TextField中编辑长度单位Measurement类型的值?

编译报错原因

你创建的Measurement<UnitLength>.FormatStyle实例仅遵守FormatStyle协议,不满足带value参数的TextField构造器要求的ParsableFormatStyle协议约束,因此触发类型不匹配错误。

可行解决方案

方案1:使用系统自带可解析测量格式样式(支持带单位输入)

直接使用Measurement<UnitLength>.ParsableFormatStyle类型,该类型原生遵守ParsableFormatStyle协议,可直接传入TextField的format参数,支持用户输入带单位的数值,系统会自动解析转换为对应Measurement<UnitLength>值。
示例代码:

import SwiftUI

struct HeightInputView: View {
    // 声明可解析的长度测量格式样式
    private let heightFormatStyle = Measurement<UnitLength>.ParsableFormatStyle(
        width: .abbreviated,
        usage: .general,
        locale: .current
    )
    // 存储房屋高度的测量类型变量,默认单位可自行修改
    @State private var houseHeight = Measurement(value: 3.5, unit: UnitLength.meters)
    
    var body: some View {
        TextField("房屋高度", value: $houseHeight, format: heightFormatStyle)
            .keyboardType(.numbersAndPunctuation) // 适配数字+单位输入
    }
}

该方案下用户可以直接输入类似6 ft的内容,系统会自动根据当前地区规则转换为你设置的单位存储。

方案2:自定义数值绑定中转(固定单位场景更易用)

如果不需要支持用户切换单位,只想让用户输入纯数值,可通过绑定中转实现,逻辑更简单可控:

import SwiftUI

struct HeightInputView: View {
    // 固定单位为米的高度变量
    @State private var houseHeight = Measurement(value: 3.5, unit: UnitLength.meters)
    // 中转绑定,只暴露数值给TextField
    private var heightValue: Binding<Double> {
        Binding(
            get: { houseHeight.value },
            set: { houseHeight.value = $0 }
        )
    }
    
    var body: some View {
        TextField("房屋高度(米)", value: heightValue, format: .number.precision(.fractionLength(0...2)))
            .keyboardType(.decimalPad)
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 03:18:03