Структура ‘State’ не может использоваться в качестве атрибута

#ios #swift #macos #swiftui #watchos

#iOS #swift #macos #swiftui #watchos

Вопрос:

У меня есть следующий код в ContentView.swift файле:

 struct ContentView: View {
    @State private var selectedSpeed: Int = 1
    
    var body: some View {
        Text("Hello World")
    }
}
 

Я упростил его для удобства чтения. Я знаю, что selectedSpeed это не используется.

В строке, где selectedSpeed объявлено, я получаю следующую ошибку: структура ‘State’ не может использоваться в качестве атрибута

Интересно, что вставка точно такого же кода на игровой площадке успешно выполняется. Я использую Xcode 12.1. Я пробовал комбинацию удаления производных данных и повторного открытия Xcode, но ошибка сохраняется. Есть идеи, что здесь не так?

Ответ №1:

Оказалось, что у меня был struct вызван State в моем проекте, и это вызвало проблему.

TL; DR: никогда не вызывайте ни одну из ваших структур и, возможно, классов, State, если вы планируете использовать SwiftUI. Я бы расширил его, чтобы не называть какие-либо из ваших классов или структур чем-то, что противоречит оболочке свойств.

Это также объясняет, почему на игровой площадке все было в порядке.

Навигатор отчетов на самом деле давал мне подсказку

введите описание изображения здесь

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

1. Черт возьми. То же самое для меня. Просто на всякий случай изменил мои объекты на: stateObj, CityObj и CountryObj.

2. Спасибо, что поделились причиной этой проблемы. Вы только что сэкономили мне часы, когда я ломал голову.

3. Спасибо за ваш комментарий. Это основная причина, по которой я решил поделиться в первую очередь! Я уже потерял пару часов, понимая, что было не так: D

Ответ №2:

Имя State не защищено, и в соответствии с вашим ответом / ответом, который вы State объявили в другом месте, либо в своем собственном приложении, либо внутри зависимости, которую вы можете импортировать в этот файл.

Вы можете указать компилятору, какой символ использовать, явно установив правильное «Пространство имен».

Например:

 struct ContentView: View {
    @SwuiftUI.State private var selectedSpeed: Int = 1
    
    var body: some View {
        Text("Hello World")
    }
}