У меня есть список примеров сообщений, которые используют интерполяцию строк, чтобы сделать пример более релевантным для пользователя. Поскольку я обнаружил, что нельзя использовать переменные до того, как вы инициируете класс, он создается как пустой [String]
, а затем присваивается значение после init()
. Однако переменные, используемые в строках, затем изменяются с помощью средства выбора. Кроме того, класс используется как @EnvironmentVariable
, и поэтому все изменяется отправителю при изменении, и я думаю, в этом и заключается проблема - я думаю, что есть некоторая проблема с интерполяцией, которая не позволяет ему подписаться наизменения издателя.
Класс определен так:
class GlobalVars: ObservableObject {
let objectWillChange = PassthroughSubject<GlobalVars,Never>()
var listToChooseFrom: [String] = [
"a list",
"of options",
"to be chosen from"
] {
didSet {
objectWillChange.send(self)
}
}
var listPos: Int = 0 {
didSet {
objectWillChange.send(self)
}
}
var stringToChange: String {
didSet {
objectWillChange.send(self)
}
}
var output: [String] {
didSet {
objectWillChange.send(self)
}
}
init() {
switch listPos {
case 0:
stringToChange = "a value"
case 1:
stringToChange = "another value"
default:
stringToChange = "toodleydoo"
}
output = [
"a list",
"with several variables",
"defined above",
"and one modified within the init() statement",
"referenced within strings",
"like \(stringToChange)."
]
}
}
Средство выбора определено как таковое и изменяет значение listPos
относительно listToChooseFrom
:
Picker("Select an option", selection: $globalVars.listPos) {
ForEach(0 ..< globalVars.listToChooseFrom) {
Text("\(self.globalVars.listToChooseFrom[$0])")
}
}
Я хочу, чтобы код в операторе init()
запускался каждый раз, когда сборщик изменяет globalVars.listPos
. Спасибо за помощь:)