Swift本身是一门很新的编程语言,借鉴及增添了其他语言的许多优良特性,可以写出很优雅的代码!~
业务中很多的条件判断怎么办,是否需要一长串的if ... else if ... else if .... else if ... else , 这就是传说中的鞭尸金字塔,出现鞭尸金字塔,会导致代码的可读性及维护性都很差,今天利用Swift的一些“优点”,优雅的解决所谓的“鞭尸金字塔”
定义好满足条件的规则, 这里以股票买卖界面的判断条件来做栗子
1.止蚀单价格不能为空,提示“请输入最低卖价”
2.最低卖价不能为空,提示“请输入最低卖价”
3.最低卖价低于止蚀价格时,提示“最低卖价必须低于止蚀价格”
4.股票价格为空且订单类型为非市价单时,提示“请输入价格”
5.股票价格填入0且订单类型为非市价单时,提示“价格不能为0”
6.股数为空时,提示“请输入股数”
7.持仓数量不足时,提示“持仓数量不足”
8.买入或卖出时股数不正确,提示“不能输入碎股”
根据以上条件,首先定义验证规则
1.具有判断的前提条件condition
2.验证结果中,有三种:是否验证通过、判断的参数类型、错误提示
3.依次满足以上所有条件,所以使用数组来处理条件的判断
由此,我们可以定义验证规则的结构, 这里还是喜欢用别名来增加代码的可读性
//验证结果的数据模型:(是否通过, 参数类型,错误提示文案)
typealias CCBTradeInputCellAuthResult = (Bool, CCBTradeInputCellType, String)
//条件判断模型:(condition:验证条件, 验证结果)
typealias CCBTradeInputCellAuthRule = (condition: Bool, result: CCBTradeInputCellAuthResult)
//专门为数组拓展一个方法,遍历数组各条件后输出最后结果
extension Array where Element == CCBTradeInputCellAuthRule {
var tradeAuthQueneResult: CCBTradeInputCellAuthResult {
for rule in self {
if rule.condition { return rule.result }
}
return (true, .none, "")
}
}
模拟业务场景
1.可能是多个页面下(亦或者是一个页面分不同的class的拆分:如用户的输入是一个类class,用户账户信息是另一个class, 股票信息又拆分至另一个class),所以使用面向协议来处理这样的场景:
首先定义一个protocol,其中,实现一个交易条件是否满足的验证方法doVerify
protocol CCBATradeVerifyProtocol {
func doVerify() -> Bool
}
股票买卖界面的条件判断栗子
class FCBuySellInputController: CCBATradeVerifyProtocol {
....
func doVerify() -> Bool {
let rules: [CCBTradeInputCellAuthRule] = [
((propType == .SLS && wrapStopLossInput.isEmpty), (false, .stopLossPrice, "请输入止蚀价格".local())),
((propType == .SLS && priceDouble > stopLossPriceDouble), (false, .price, "最低卖价必须低于止蚀价格".local())),
((propType == .SLS && wrapPriceInput.isEmpty), (false, .price, "请输入最低卖价".local())),
((wrapPriceInput.isEmpty && propType != .MKT), (false, .price, "请输入价格".local())),
((priceDouble == 0 && propType != .MKT), (false, .price, "请输入价格".local())),
((wrapAmountInput.isEmpty), (false, .amount, "请输入股数".local())),
((tmpAmountInt == 0), (false, .amount, "股数无效。股数须大于零".local())),
(((tmpAmountInt > viewModel.numInputViewModel.limitAmount) && tradeAction == .buy), (false, .amount, "买入数量超出限额".local().local())),
(((tmpAmountInt > viewModel.numInputViewModel.limitAmount) && tradeAction == .sell), (false, .amount, "持有量不足".local().local())),
((isFragment && tradeAction == .buy), (false, .amount, "股数不正确。请重新输入".local())),
((isFragment && tradeAction == .sell), (false, .amount, "股数不正确。请重新输入".local()))
]
// 使用数组的拓展方法直接验证获取结果
let result: CCBTradeInputCellAuthResult = rules.tradeAuthQueneResult
let isAuth = result.0
//处理验证结果:弹窗或者其他操作
process(result)
return isAuth
}
private func process(_ authResult: CCBTradeInputCellAuthResult) {
/* 处理结果: 弹窗信息 */
}
}
从上面代码看,每个条件下的规则都很清楚,在定位问题及规则增、减、改时均比一堆if else 来得清除,不会弄容易弄错!仅需要在修改对应的条件或者按照对应的顺序删除或者插入“条件判断规则”即可
网友评论