SwiftUI: пользовательский модификатор представления не соответствует ViewModifier?

Я пытаюсь создать этот модификатор:

      struct CustomTextBorder: ViewModifier {
    func body(content: Content) -> some View {
        return content
            .font(.largeTitle)
            .padding()
            .overlay(
                RoundedRectangle(cornerRadius: 15)
                    .stroke(lineWidth: 2)
            )
            .foregroundColor(.blue)
    }
}

Когда я это сделаю, я получаю Type 'CustomTextBorder' does not conform to protocol 'ViewModifier' ошибка.

Кажется, я должен добавить:

typealias Body = <#type#>

Тем не менее, я вижу, что модификаторы создаются так же, как и здесь изначально, без необходимости указывать typealias Body...

Этот модификатор работает здесь:

https://www.simpleswiftguide.com/how-to-make-custom-view-modifiers-in-swiftui/

Почему у меня не работает?

Как заставить работать этот модификатор? Почему для одних это работает, а для других нет? Зависит ли это от того, на что нацелен проект? Я ориентируюсь на iOS 15.

2 ответа

Не видя вашей реализации, похоже, что вы не инициализируете модификатор. Убедитесь, что вы используете фигурные скобки в конце CustomTextBorder(). Помните, что это все еще функция, которую необходимо вызвать.

      Text("SwiftUI Tutorials")
  .modifier(CustomTextBorder())

То же самое, если вы делаете расширение View

      extension View {
  func customTextBorder() -> some View {
    return self.modifier(CustomTextBorder())
  }
}

Ваш код работает нормально, но почему ViewModifier? вам не нужен ViewModifier для этой простой вещи, вы можете использовать расширение следующим образом:

      struct ContentView: View {
    
    var body: some View {

        Text("Hello, World!").customTextBorder
        
    }
    
}



extension Text {
    
    var customTextBorder: some View {
        
        return self
            .font(.largeTitle)
            .padding()
            .overlay(
                RoundedRectangle(cornerRadius: 15)
                    .stroke(lineWidth: 2)
            )
            .foregroundColor(.blue)
        
    }
    
}

Другие вопросы по тегам