Кнопка не распознает PrimitiveButtonStyle и может быть недоступна в контексте

В настоящее время я изучаю SwiftUI, и каким-то образом при использовании .buttonStyle в Button статические свойства, такие как .bordered и .borderless, невозможно найти в автозаполнении Xcode, и если я принудительно ввожу его, отображается ошибка:

Это статическое свойство определено в PrimitiveButtonStyle и может быть недоступно в этом контексте.

Кто-нибудь знает, что является причиной этого? Я не могу найти обсуждения по этой проблеме.

Я попробовал переписать код с другим подходом, а также перезапустить Xcode.

Вы пытались игнорировать это и все равно просто скомпилировать код? Сам код работает, верно? Это просто тупость автозаполнения Xcode.

Sweeper 20.04.2024 07:05

@Sweeper да, игнорирование и принудительный ввод кода работает, но я не уверен, что это было хорошо, и боюсь, что это может привести к сбою в будущем

Stevefrdnt 20.04.2024 07:17

Не волнуйся. Это просто ошибка Xcode, не связанная с вашим кодом.

Sweeper 20.04.2024 07:21
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
3
101
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете игнорировать эту ошибку и набрать .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 в списке автозаполнения.

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