В настоящее время я изучаю SwiftUI, и каким-то образом при использовании .buttonStyle
в Button
статические свойства, такие как .bordered
и .borderless
, невозможно найти в автозаполнении Xcode, и если я принудительно ввожу его, отображается ошибка:
Это статическое свойство определено в PrimitiveButtonStyle и может быть недоступно в этом контексте.
Кто-нибудь знает, что является причиной этого? Я не могу найти обсуждения по этой проблеме.
Я попробовал переписать код с другим подходом, а также перезапустить Xcode.
@Sweeper да, игнорирование и принудительный ввод кода работает, но я не уверен, что это было хорошо, и боюсь, что это может привести к сбою в будущем
Не волнуйся. Это просто ошибка Xcode, не связанная с вашим кодом.
Вы можете игнорировать эту ошибку и набрать .bordered
, не используя подсказки автозаполнения. После этого Xcode, как и ожидалось, успешно скомпилирует код без ошибок.
Xcode здесь просто запутался, потому что есть две перегрузки buttonStyle
, имеющие почти одинаковую сигнатуру, за исключением разных ограничений на типы их параметров. (1 , 2)
func buttonStyle<S>(_ style: S) -> some View where S : PrimitiveButtonStyle
func buttonStyle<S>(_ style: S) -> some View where S : ButtonStyle
В этом случае автозаполнение не может найти статические члены PrimitiveButtonStyle
и ButtonStyle
при вводе .
, а вместо этого находит только статические члены ButtonStyle. Следовательно, bordered
, borderless
и т. д. не входят в список автозаполнения. Судя по моим экспериментам, кажется, что в пользу перегрузки, объявленной последней.
Мы можем воспроизвести это поведение на простом примере:
protocol Foo {
}
protocol Bar {
}
extension Foo {
static var foo: Foo { fatalError() }
}
extension Bar {
static var bar: Bar { fatalError() }
}
func foo<T: Foo>(_ foo: T) {}
func foo<T: Bar>(_ foo: T) {}
foo(./* only bar is shown in the autocomplete here */)
Если вам действительно не нравится видеть «ошибку», вы можете обернуть существующий модификатор buttonStyle
собственным модификатором с другим именем.
extension View {
func buttonAppearance<S: PrimitiveButtonStyle>(_ s: S) -> some View {
buttonStyle(s)
}
}
Теперь, набрав .buttonAppearance(.)
, вы получите статические члены PrimitiveButonStyle
в списке автозаполнения.
Вы пытались игнорировать это и все равно просто скомпилировать код? Сам код работает, верно? Это просто тупость автозаполнения Xcode.