Swift如何不使用多层if条件完成多个值的有效性校验
问题解答
完全可以不用写大量条件语句实现多值校验,你想到的通过数组统计符合条件项数的思路完全可行。
你的原有代码逻辑本质是统计offer_visitor_中指定4个key对应值的「存在且非空」的个数,直接把个数作为返回值,完全没必要写多层嵌套判断,优化后代码如下:
首先先把重复的UI更新逻辑抽成公用方法,避免冗余代码:
private func updateNoOffersLabel(duration: TimeInterval) { let tipText = UserDefaults.language == "ar" ? ArabicLanguageFile.NoOffers : EnglishLanguageFile.NoOffers UIView.transition(with: self.noHistory_Label!, duration: duration, options: .transitionCrossDissolve, animations: { [weak self] in self?.noHistory_Label?.text = tipText }, completion: nil) }
然后替换原有大量if else的逻辑:
// 列出所有需要校验的key let targetKeys = ["Offer", "VideoReward", "BirthdayReward", "promotional"] var validCount = 0 var allUnwrapSuccess = true for key in targetKeys { guard let value = self.offer_visitor_[key] else { allUnwrapSuccess = false break } if !value.isEmpty { validCount += 1 } } if allUnwrapSuccess { if validCount == 0 { updateNoOffersLabel(duration: 0.35) } return validCount } else { updateNoOffersLabel(duration: 1) return 0 }
动态值场景的实现
你提到的map+filter的写法完全可用,甚至更简洁,对于动态变化的校验项,你可以直接构造校验条件数组,统计符合要求的数量即可:
// 你示例的动态校验场景可以直接这么写 let checkList = [ arrayData1["Available Offers"]?.count ?? 0 > 0, arrayData1["Redeemtion Offers"]?.count ?? 0 > 0, arrayData1["Redeemtion Vouchers"]?.count ?? 0 > 0, arrayData1["Available Vouchers"]?.count ?? 0 > 0 ] let validCount = checkList.filter{ $0 }.count
这种写法的优势非常明显:
- 后续新增校验项只需要往数组里加对应判断条件即可,不需要修改其他逻辑
- 代码可读性高,一眼就能看出来校验逻辑和返回值规则
- 没有冗余重复代码,维护成本极低
内容的提问来源于stack exchange,提问作者Manikandan S
相关产品推荐
相关产品推荐

