Init
parent
dad4631a4d
commit
5d47085f93
|
@ -1,2 +1,2 @@
|
|||
# calculator-swift
|
||||
|
||||
# mrCalculator
|
||||
Calculator for iOS written in Swift
|
||||
|
|
|
@ -0,0 +1,162 @@
|
|||
//
|
||||
// ContentView.swift
|
||||
// mrCalculator
|
||||
//
|
||||
// Created by mrtuxa on 25.08.22.
|
||||
//
|
||||
|
||||
import SwiftUI
|
||||
|
||||
enum CalcButton: String {
|
||||
case one = "1"
|
||||
case two = "2"
|
||||
case three = "3"
|
||||
case four = "4"
|
||||
case five = "5"
|
||||
case six = "6"
|
||||
case seven = "7"
|
||||
case eight = "8"
|
||||
case nine = "9"
|
||||
case zero = "0"
|
||||
case add = "+"
|
||||
case subtract = "-"
|
||||
case divide = "/"
|
||||
case multiply = "x"
|
||||
case equal = "="
|
||||
case clear = "AC"
|
||||
case decimal = "."
|
||||
case percent = "%"
|
||||
case negative = "-/+"
|
||||
|
||||
var buttonColor: Color {
|
||||
switch self {
|
||||
case .add, .subtract, .multiply, .divide, .equal:
|
||||
return .orange
|
||||
case .clear, .negative, .percent:
|
||||
return Color(.lightGray)
|
||||
default:
|
||||
return Color(UIColor(red: 55/255.0, green: 55/255.0, blue: 55/255.0, alpha: 1))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
enum operation {
|
||||
case add, subtract, multiply, divide, none
|
||||
}
|
||||
|
||||
struct ContentView: View {
|
||||
|
||||
@State var value = "0"
|
||||
@State var currentOperation: operation = .none
|
||||
@State var runningNumber = 0
|
||||
|
||||
let buttons: [[CalcButton]] = [
|
||||
[.clear, .negative, .percent, .divide],
|
||||
[.seven, .eight, .nine, .multiply],
|
||||
[.four, .five, .six, .subtract],
|
||||
[.one, .two, .three, .add],
|
||||
[.zero, .decimal, .equal]
|
||||
]
|
||||
|
||||
var body: some View {
|
||||
ZStack {
|
||||
Color.black.edgesIgnoringSafeArea(.all)
|
||||
|
||||
VStack {
|
||||
Spacer()
|
||||
|
||||
// Text display
|
||||
HStack {
|
||||
Spacer()
|
||||
Text("0")
|
||||
.bold()
|
||||
.font(.system(size: 100))
|
||||
.foregroundColor(.white)
|
||||
}.padding()
|
||||
|
||||
// Buttons
|
||||
ForEach(buttons, id: \.self) { row in
|
||||
HStack(spacing: 12) {
|
||||
ForEach(row, id: \.self) { item in
|
||||
Button(action: {
|
||||
self.onTapListener(button: item)
|
||||
}, label: {
|
||||
Text(item.rawValue)
|
||||
.font(.system(size: 32))
|
||||
.frame(width: self.buttonWidth(item: item),
|
||||
height: self.buttonHeight())
|
||||
.background(item.buttonColor)
|
||||
.foregroundColor(.white)
|
||||
.cornerRadius(self.buttonWidth(item: item)/2)
|
||||
})
|
||||
}
|
||||
}.padding(.bottom, 3)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func onTapListener(button: CalcButton) {
|
||||
switch button {
|
||||
case .add, .subtract, .multiply, .divide, .equal:
|
||||
if button == .add {
|
||||
self.currentOperation = .add
|
||||
self.runningNumber += Int(self.value) ?? 0
|
||||
} else if button == .subtract {
|
||||
self.currentOperation = .subtract
|
||||
self.runningNumber += Int(self.value) ?? 0
|
||||
} else if button == .multiply {
|
||||
self.currentOperation = .multiply
|
||||
self.runningNumber += Int(self.value) ?? 0
|
||||
} else if button == .divide {
|
||||
self.currentOperation = .divide
|
||||
self.runningNumber += Int(self.value) ?? 0
|
||||
} else if button == .equal {
|
||||
let runningValue = self.runningNumber
|
||||
let currentValue = Int(self.value) ?? 0
|
||||
switch self.currentOperation {
|
||||
case .add: self.value = "\(runningValue + currentValue)"
|
||||
case .subtract: self.value = "\(runningValue - currentValue)"
|
||||
case .multiply: self.value = "\(runningValue * currentValue)"
|
||||
case .divide: self.value = "\(runningValue / currentValue)"
|
||||
case .none:
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
if button != .equal {
|
||||
self.value = "0"
|
||||
}
|
||||
|
||||
case .clear:
|
||||
break
|
||||
case .decimal, .negative, .percent:
|
||||
break
|
||||
default:
|
||||
let number = button.rawValue
|
||||
if self.value == "0" {
|
||||
value = number
|
||||
} else {
|
||||
self.value = "\(self.value)\(number)"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func buttonWidth(item: CalcButton) -> CGFloat {
|
||||
if item == .zero {
|
||||
return ((UIScreen.main.bounds.width - (4*12)) / 4) * 2
|
||||
}
|
||||
return (UIScreen.main.bounds.width - (5*12)) / 4
|
||||
}
|
||||
|
||||
func buttonHeight() -> CGFloat {
|
||||
return (UIScreen.main.bounds.width - (5*12)) / 4
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
struct ContentView_Previews: PreviewProvider {
|
||||
static var previews: some View {
|
||||
ContentView()
|
||||
}
|
||||
}
|
|
@ -0,0 +1,17 @@
|
|||
//
|
||||
// mrCalculatorApp.swift
|
||||
// mrCalculator
|
||||
//
|
||||
// Created by mrtuxa on 25.08.22.
|
||||
//
|
||||
|
||||
import SwiftUI
|
||||
|
||||
@main
|
||||
struct mrCalculatorApp: App {
|
||||
var body: some Scene {
|
||||
WindowGroup {
|
||||
ContentView()
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue