Sim*_*one 0 generics protocols swift swiftui
考虑 SwiftUI 中的以下扩展:
extension Text{
func applyBG() -> some View {
self
.padding(20)
.background(Color(hue: 0, saturation: 0, brightness: 0.22).cornerRadius(10))
.foregroundColor(.white)
}
}
extension TextField{
func applyBG() -> some View {
self
.padding(20)
.background(Color(hue: 0, saturation: 0, brightness: 0.22).cornerRadius(10))
.foregroundColor(.white)
}
}
Run Code Online (Sandbox Code Playgroud)
我觉得我可以写得更好,避免重复。我可能可以用类似的方法解决这个问题:
extension View{
func applyBG() -> some View {
self
.padding(20)
.background(Color(hue: 0, saturation: 0, brightness: 0.22).cornerRadius(10))
.foregroundColor(.white)
}
}
Run Code Online (Sandbox Code Playgroud)
但我不希望我所有的观点都能够调用这个方法。我只希望 Text 和 Textfield 有这样的方法。我尝试使用协议和关联类型,但我无法一次编写这些行以实现干净的代码。关于如何实现 DRY 的任何提示或伪代码?
使用像这样的协议:
import SwiftUI
protocol BGApplyable where Self: View {}
extension BGApplyable {
func applyBG() -> some View {
self
.padding(20)
.background(Color(hue: 0, saturation: 0, brightness: 0.22).cornerRadius(10))
.foregroundColor(.white)
}
}
Run Code Online (Sandbox Code Playgroud)
决定哪些视图可以采用协议:
extension TextField: BGApplyable {}
extension Text: BGApplyable {}
Run Code Online (Sandbox Code Playgroud)
然后使用它:
var body: some View {
VStack {
Text("Foo")
.applyBG()
TextField("Hello", text: .constant("World!"))
.applyBG()
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
80 次 |
| 最近记录: |