Как в SwiftUI реализовать обертку для кнопки, которая при нажатии изменяет текст в другом View (например, в Text)?

«Как в SwiftUI реализовать обертку для кнопки, которая при нажатии изменяет текст в другом View (например, в Text)?» — вопрос из категории SwiftUI, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В SwiftUI для реакции на действия и изменения состояния используется декларативный подход с @State и привязками (Binding).

Базовое решение с @State:

struct ContentView: View {
    @State private var labelText = "Исходный текст" // 1. Создаем состояние

    var body: some View {
        VStack {
            Text(labelText) // 2. Отображаем состояние
                .padding()

            Button("Изменить текст") { // 3. Кнопка изменяет состояние
                labelText = "Новый текст после нажатия"
            }
            .padding()
            .background(.blue)
            .foregroundColor(.white)
            .cornerRadius(8)
        }
    }
}

Расширенный пример с кастомной оберткой кнопки:

Если нужно переиспользовать логику, можно создать компонент, принимающий замыкание действия.

struct ActionButton: View {
    let title: String
    let action: () -> Void // Замыкание для действия

    var body: some View {
        Button(title, action: action)
            .padding()
            .background(Color.blue)
            .foregroundColor(.white)
            .cornerRadius(8)
    }
}

// Использование
struct ParentView: View {
    @State private var infoText = "Нажми кнопку"

    var body: some View {
        VStack {
            Text(infoText)
            ActionButton(title: "Обновить") {
                infoText = "Текст обновлен в (Date())"
            }
        }
    }
}

Ключевой принцип: Изменение @State свойства автоматически вызывает перерисовку (body) всех зависимых View, что обновляет интерфейс.