买东西太多折扣套路,使用SwiftUI搭建一个折扣计算器App帮你计算吧(下)
类型转换
由于我们Text
文字部分是String
类型的内容,而折扣计算涉及到数值计算,因此我们需要做一个转换的方法,示例:
extension String { var toFloat: Float { return Float(self) ?? 0 } }
上述代码中,我们对String
进行拓展,我们声明了一个方法toFloat
,可以将String
类型转换为Float
类型。
折扣计算
折扣计算部分,我们可按照折扣规则,计算出最终的价格finalPrice
,示例:
// 计算方法 func calculate() -> String { if finalDiscount == "" { finalPrice = priceStr } else if finalDiscount == "买一送一" { finalPrice = String(priceStr.toFloat / 2) } else if finalDiscount == "买三送一" { finalPrice = String(priceStr.toFloat * 3 / 4) } else if finalDiscount == "第二瓶半价" { finalPrice = String(priceStr.toFloat * 0.75) } else if finalDiscount == "加一元多一件" { finalPrice = String((priceStr.toFloat + 1) / 2) } return finalPrice }
上述代码中,我们声明了一个方法calculate
,返回String
类型的值。
当finalDiscount
折扣为空时,折扣价finalPrice
等于priceStr
输入的价格,其他规则也是折扣价finalPrice
和priceStr
输入的价格的对应数学公式。
只是由于涉及数值计算,我们将priceStr
输入的价格通过toFloat
方法转为数值型,计算后再转换为String
类型。
折扣计算方法最终return
折扣价finalPrice
的值。
交互操作
折扣计算方法设置好后,我们可以开始计算了。我们在priceInput
视图中,当价格输入值onChange
变化时,我们立即更新输出的结果。示例:
// 价格输入 func priceInput() -> some View { TextField("0.00", text: $priceStr) //隐藏了一些修饰符 .onChange(of: priceStr) { _ in if priceStr != "" { finalPrice = calculate() } else { finalPrice = "0.00" } } }
上述代码中,我们在TextField
中绑定的priceStr
输入值改变时,若priceStr
输入值不为空,则将计算方法得出的结果calculate()
赋值给finalPrice
折扣价。
若priceStr
输入值为空,则重新赋值finalPrice
折扣价为空。
最后,当用户点击折扣价规则时,我们也需要立即计算最终的折扣价,示例:
// 折扣活动 func discountEvent() -> some View { VStack(spacing: 10) { ForEach(discountType.indices, id: \.self) { item in Text(discountType[item]) //隐藏了一些修饰符 .onTapGesture { finalDiscount = discountType[item] finalPrice = calculate() } } } }
隐藏键盘
由于折扣计算机有输入和选择折扣两种操作,当TextField
输入时会唤起系统键盘,这样输入完成后可能存在遮挡折扣选择的视图。
我们可以创建一个隐藏键盘的方法,示例:
extension View { func hideKeyboard() { UIApplication.shared.sendAction( #selector(UIResponder.resignFirstResponder), to: nil, from: nil, for: nil ) } }
然后在ContentView
视图中,当整个视图被点击时调用隐藏键盘的方法。示例:
var body: some View { VStack { titleView() priceInput() priceOutput() Spacer() discountEvent() Spacer() } .padding() .onTapGesture { self.hideKeyboard() } }
就此,我们就完成了整个项目的样式和逻辑。
项目展示
恭喜你,完成了整个项目的全部内容!