Это может быть одна глупая и простая ошибка, но прошло некоторое время с тех пор, как я в последний раз прикасался к Swift, так что я был бы признателен за помощь.
У меня есть один наблюдаемый объект (listOfWordsCounted
) в классе ListToPrint
, где я сохраняю слова, которые хочу напечатать.
Цель состоит в том, чтобы написать предложение в текстовом поле, подсчитать количество вхождений каждого слова и отобразить его. Я выбрал список, потому что он показался мне подходящим, но я не получаю никакого сигнала от цикла ForEach.
import SwiftUI
import Foundation
class Word: Identifiable {
var id: String
var nTimes: Int = 1
init(string: String) {
self.id = string
}
func count() {self.nTimes += 1 }
}
class ListToPrint: ObservableObject {
var wordsToPrint: [Word] = []
init() {}
init(sentence: String){
self.update(sentence: sentence)
}
func update(sentence: String){
let componentsOfSentence = getStrComponentsArray(str: sentence)
for comp in componentsOfSentence {
if wordsToPrint.first(where: {$0.id == comp}) != nil
{
wordsToPrint.first(where: {$0.id == comp})!.count()
} else
{
wordsToPrint.append(Word(string: comp))
}
}
}
func getStrComponentsArray(str: String) -> [String] {
return str.components(separatedBy: " ")
}
}
struct ContentView: View {
@State private var sentence = ""
@ObservedObject private var listOfWordsCounted = ListToPrint()
var body: some View {
VStack {
Image(systemName: "globe")
.imageScale(.large)
.foregroundColor(.accentColor)
Text("Hello, world!")
TextField("Let me count your sentence", text: $sentence)
Button("Count")
{
listOfWordsCounted.update(sentence: sentence)
print(listOfWordsCounted.wordsToPrint)
}
.foregroundColor(Color.red)
.padding()
.background(Color(red: 0, green: 0, blue: 0.5))
.clipShape(Capsule())
Button("Print")
{
for word in listOfWordsCounted.wordsToPrint {
print(word.id)
}
}
List {
// Text(" appeared " + "times")
ForEach(self.listOfWordsCounted.wordsToPrint){ word in
Text(word.id)
}
}
}
.padding()
}
}
Я ожидал список со словами, которые я написал в текстовом поле.
@Published var wordsToPrint: [Word] = []
Я действительно ржавый, большое спасибо
В дополнение к данному ответу вы должны использовать
@StateObject
, а не@ObservedObject
, когдаView
владеет указанным объектом.