Что такое общий c тип HStack? - PullRequest
1 голос
/ 10 июля 2020

Я создаю приложение-калькулятор в SwiftUI в рамках курса разработки iOS. Пользовательский интерфейс выглядит следующим образом:

введите описание изображения здесь

Как мы видим, там пять рядов кнопок, каждая кнопка имеет текст, а также панель результатов представляет собой текст. Таким образом, извлечение текста, кнопок и строк в отдельные представления работает отлично. Ниже приведен код, который создает строку.

struct RowView: View {
    let buttons: [CalculatorButton]
    @Binding var result: String
    let calc: Calculator
    
    var body: some View {
        createCells(self.buttons)
    }
    
    private func createCells(_ buttons: [CalculatorButton]) -> some View {
        if buttons.count % 2 == 0 {
            return AnyView(HStack(spacing: 1) {
                ForEach(buttons, id: \.label) { button in
                    ButtonView(button: button, result: self.$result, calc: self.calc)
                }
            })
        } else {
            return AnyView(HStack(spacing: 1) {
                ButtonView(button: buttons[0], result: self.$result, calc: self.calc)
                createCells(buttons.suffix(2))
            })
        }
    }
}

Идея состоит в том, что если в строке четное количество кнопок, они просто располагаются горизонтально. Для последней строки мы вручную размещаем первую кнопку, а затем выполняем рекурсивный вызов, который размещает две оставшиеся кнопки по горизонтали. Милая!

Однако код AnyView(HStack(spacing: 1) повторяется в блоке if-else. Я попытался создать локальную переменную для содержимого HStack, но не смог найти тип, который успешно скомпилирован для if и else. Возможно ли это сделать? Я использую Xcode 11.5 со Swift 5.

...