如何让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
相关产品推荐
相关产品推荐

