У меня есть следующий одноэлементный класс SettingsManager:
Код: Выделить всё
final class SettingsManager: ObservableObject {
static let shared = SettingsManager()
private init() {}
@AppStorage("showTimeLeft") var showTimeLeft = true
@AppStorage("hideAppOnTimerStart") var hideAppOnTimerStart = false
// More settings here
}
Код: Выделить всё
if SettingsManager.shared.showTimeLeft {
Text("Time left here")
}
Как правильно перенести этот класс на Swift 6? В настоящее время я получаю следующую ошибку:
Как правильно перенести этот класс на Swift 6? В настоящее время я получаю следующую ошибку:
Как правильно перенести этот класс на Swift 6? p>
Статическое свойство «shared» не является безопасным для параллелизма, поскольку тип «SettingsManager», отличный от «Sendable», может иметь общее изменяемое состояние
< /blockquote>
XCode дает мне три варианта:
- Класс SettingsManager не соответствует протоколу Sendable
< li>Добавьте аннотацию «shared» с помощью @MainActor, если доступ к свойству должен быть доступен только от главного актера. - Отключите проверки безопасности параллелизма, если доступ защищен механизмом внешней синхронизации.
Аннотирование всего класса с помощью @MainActor работает, поскольку удаляет все ошибки, но считается ли это хорошей практикой? Я пока мало что знаю о Swift, но я уверен, что @MainActor в первую очередь предназначен для кода пользовательского интерфейса? Однако я могу ошибаться.
Третий вариант, я думаю, здесь не применим.
P.S.: Я действительно не знаю, что делаю, и вполне возможно, что этот одноэлементный шаблон вообще является ужасной идеей --- просто дайте мне знать, если это так.
Подробнее здесь: https://stackoverflow.com/questions/793 ... oncurrency