目前,我正在构建一个克隆银行应用程序,我要做的一件事就是添加“拆分交易”(然后可以与一组分别支付给定金额的朋友共享)。
最初,交易在朋友之间平均分配(除非交易不平均,在这种情况下,其余部分将添加到一个不幸的朋友上)。然后,用户可以手动调整每个支付的金额,然后更新其他金额。如果用户手动调整了朋友的金额,则如果用户随后调整了另一个朋友的金额,则该朋友的“拆分”不会自动更新(即,如果用户说friend1支付了12英镑,那么在用户支付之前,该金额始终为12英镑。用户说相反)。
我一直在努力使该方法尽可能简洁和“灵活”-但我非常感谢我对方法的反馈。
出于此目的,我仅尝试在人与人之间平均分配资金(但我仍然想解释“用户定义的分配”,因此当前代码有意义)。
我正在使用https://github.com/Flight-School/Money来表示交易值,所有这些都在Transaction类中。我需要四舍五入以确保拆分和余数保持在小数点后两位。以下是相关代码:
用于保存金额以及用户是否设置金额的结构(出于可编码的原因,该金额必须为自定义对象):
a
一个字典,用于保存朋友的姓名及其拆分,以及由用户设置的拆分名-也是一个易于显示的namesOfPeopleSplittingTransaction数组。
struct SplitTransactionAmount: Codable {
let amount: Money<GBP>
let setByUser: Bool
}
这是拆分交易的方法:
var splitTransaction: [String: SplitTransactionAmount]
var namesOfPeopleSplittingTransaction = [String]()
我认为我发现的问题是代码对我来说很有意义,但是我不确定外部读者对此有多清晰。对于我的方法有任何想法,将不胜感激(对于较长的问题,我们深表歉意!)而且我也很想知道是否有任何更简洁的方法可以写出来!
非常感谢
答案 0 :(得分:0)
IMO,通过不同ifs
上的两个循环简化为一个循环。并减少重复的代码(例如SplitTransactionAmount的init)
for (index, friend) in uniqueFriends.enumerated(){ //or if you don't prefer enumerated, use == on first index like before.
let money: Money<GBP>
if remainder != 0, index == 0 { //ensure remainder is only used if has value.
//Unlucky first friend has to pay a few pence more!
money = Money(eachTotalRounded + remainder)
} else {
money = Money(eachTotalRounded)
}
newSplitTransaction[friend] = SplitTransactionAmount(amount: money setByUser: false)
}