The following is a minimum example code with the problem.
struct TestView: View {
    @State var text = "Hello"
    let useCase = TestUseCase()

    init() {
        useCase.output = self
    }

    var body: some View {
        Text(text)
            .onAppear {
                // ① useCase.output = self
                useCase.show()
            }
    }
}
extension TestView: TestUseCaseOutput {
    func showText(text: String) {
        self.text = text
    }
}

class TestUseCase {
    var output: TestUseCaseOutput?
    func show() {
        output?.showText(text: "Changed")
    }
}
protocol TestUseCaseOutput {
    func showText(text: String)
}

This code changes the text from "Hello" to "Changed" when the view is displayed, but the change is not reflected. The showText method was called, but it had no effect. I also found that if I set the delegate at ①, the text was updated correctly.
Can anyone tell me the cause of this problem?

Can not update @State variable via delegate set in View.init()
SwiftUI views are structs, and therefore immutable.  Whenever a SwiftUI changes, a new instance of that view struct is created.
When you update text, SwiftUI needs to create a new instance of TestView.  But, the new instance  has text set to Hello (and it was also have a new instance of TestUseCase) so you don't see any change.
The sequence of events is:

You create an instance of TestView - This is initialised with text = "Hello"
You update text which triggers SwiftUI to recreate TestView
The newly created instance of TestView is initialised with text = "Hello"`

In SwiftUI no object should ever need to hold a reference to a View.
init() {
    useCase.output = self
}

The self you store in your TestUseCase instance will be thrown away as soon as the view is updated.  It simply isn't useful to try and hold references to SwiftUI views.
You should structure your code so that views respond to changes in your model (Via @Published for example).  Your model should never try and update a view directly.
