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

如何让SwiftUI自定义MyTextField支持泛型Hashable类型的FocusState参数

报错原因

Swift 不支持直接将协议作为具体类型传入泛型结构的声明,你需要为MyTextField声明泛型参数,约束该参数遵守Hashable协议,指代任意符合要求的聚焦状态类型。

改造后的泛型版MyTextField代码
struct MyTextField<FocusValue: Hashable>: View {
    @Binding var text: String
    let systemName: String
    let focusedValue: FocusValue
    var focusedField: FocusState<FocusValue?>.Binding
    
    init(
        text: Binding<String>,
        systemName: String,
        focusedField: FocusState<FocusValue?>.Binding,
        focusedValue: FocusValue
    ) {
        self._text = text
        self.systemName = systemName
        self.focusedField = focusedField
        self.focusedValue = focusedValue
    }
    
    var body: some View {
        HStack {
            Image(systemName: systemName)
            TextField("Name", text: $text)
                .focused(focusedField, equals: focusedValue)
                .textFieldStyle(.roundedBorder)
        }
    }
}
调用示例(和原有调用逻辑完全兼容)
struct ContentView2: View {
    enum Field: Hashable, CaseIterable {
        case name
        case fullName
        case age
    }
    
    @FocusState private var focusedField: Field?
    @State private var nameText = ""
    
    var body: some View {
        MyTextField(
            text: $nameText,
            systemName: "person",
            focusedField: $focusedField,
            focusedValue: .name
        )
    }
}
适配说明
  • 泛型参数FocusValue会自动推导调用方传入的聚焦状态类型,无需手动指定
  • 完全兼容原有调用侧的枚举定义,不需要修改现有业务代码的Field结构
  • 支持任意遵守Hashable协议的类型作为聚焦标识,适配不同业务场景的自定义需求

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 02:36:04