You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.18 15:24:05