我如何避免将这 3 行写两次?

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 的任何提示或伪代码?

use*_*975 5

使用像这样的协议:

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)