#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
}
}
}