SwiftUI:如何用.textFieldStyle(.myTextFieldStyle)替代实例化调用
SwiftUI 自定义TextFieldStyle 调用方式优化
在SwiftUI开发中,希望将自定义TextFieldStyle的调用从实例化形式 .textFieldStyle(MyTextFieldStyle()) 改为更简洁的点语法 .textFieldStyle(.myTextFieldStyle),以下是具体实现说明:
原实现代码
struct MyTextField: View { var body: some View { VStack(alignment: .leading) { Text("Label") TextField("", text: .constant(""), axis: .vertical) .textFieldStyle(MyTextFieldStyle()) } .padding() } } struct MyTextFieldStyle: TextFieldStyle { func _body(configuration: TextField<Self._Label>) -> some View { configuration .padding() .overlay { RoundedRectangle(cornerRadius: 5, style: .continuous) .stroke(.secondary, lineWidth: 1) } } }
期望的调用方式
修改后只需通过点语法引用自定义样式:
struct MyTextField: View { var body: some View { VStack(alignment: .leading) { Text("Label") TextField("", text: .constant(""), axis: .vertical) .textFieldStyle(.myTextFieldStyle) } .padding() } } struct MyTextFieldStyle: TextFieldStyle { func _body(configuration: TextField<Self._Label>) -> some View { configuration .padding() .overlay { RoundedRectangle(cornerRadius: 5, style: .continuous) .stroke(.secondary, lineWidth: 1) } } }
调用方式对比
// 原调用方式 .textFieldStyle(MyTextFieldStyle()) // 优化后调用方式 .textFieldStyle(.myTextFieldStyle)
错误尝试(无效)
曾尝试扩展TextField添加属性,但这种方式无法满足需求,因为textFieldStyle修饰符接受的是TextFieldStyle类型实例,而非TextField的属性:
extension TextField { var caviaTextFieldStyle: CaviaTextFieldStyle { .init() } }
正确解决方案
通过给TextFieldStyle添加带类型约束的扩展,限定Self为自定义的MyTextFieldStyle,并添加静态属性来实现点语法调用:
extension TextFieldStyle where Self == MyTextFieldStyle { static var myTextFieldStyle: MyTextFieldStyle { .init() } }
内容的提问来源于stack exchange,提问作者Josh
相关产品推荐
相关产品推荐

