Перечисление для ButtonStyle в SwiftUI

#swift #swiftui

#swift #swiftui

Вопрос:

Можно ли установить стиль кнопки таким образом …?

 Button() { }
   .buttonStyle(.default)
  

Вместо этого …?

 Button() { }
   .buttonStyle(DefaultButtonStyle())
  

Я пытался закодировать расширение, но оно не работает.

 extension ButtonStyle {
    static var `default`: DefaultButtonStyle {
        DefaultButtonStyle()
    }
}
  

В нем говорится: Static member 'default' cannot be used on protocol metatype 'ButtonStyle.Protocol'

Комментарии:

1. Компилятор уже ответил вам. Это ButtonStyle общий протокол (он имеет связанный тип) — вы не можете этого сделать. Могу я спросить — что вы пытаетесь здесь сделать? — Это уже по умолчанию по умолчанию, если не .buttonStyle указано.

2. Default был примером. Было бы неплохо иметь стили .link, .rounded, .bordered, .borderless без поиска в автозаполнении.

Ответ №1:

Другое решение:

 extension ButtonStyle where Self == BorderlessButtonStyle {
    
    internal static var borderless: BorderlessButtonStyle {
        BorderlessButtonStyle()
    }
}
  

Использование:

 Button("Demo") {}
    .buttonStyle(.borderless)
  

Ответ №2:

Вот демонстрация возможного подхода — используйте собственный модификатор и собственное перечисление, чтобы иметь полный контроль над всем.

Использование

 Button("Demo") {}
    .myStyle(.default)
  

И вспомогательные расширения

 enum MyButtonStyle {
    case `default`
    case borderless
    // .. extend with any custom here
}

extension Button {

    @ViewBuilder
    func myStyle(_ style: MyButtonStyle) -> some View {
        switch style {
            case .default:
                self.buttonStyle(DefaultButtonStyle())
            case .borderless:
                self.buttonStyle(BorderlessButtonStyle())
           // .. extend with any custom here
        }
    }
}