Я создаю приложение-калькулятор в 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.