Swift中如何减少嵌套if条件判断的层级?
简化嵌套If条件的方案
嘿,我完全懂你面对多层嵌套if时那种头大的感觉!咱们一步步把这段代码拆解开,用guard let和提前返回的方式彻底消除嵌套,让代码清爽起来。
先看看你贴的原代码(我补全了末尾的省略部分,方便对照):
if arenaEventItems == nil || arenaEventItems.count <= 0 { return } if (arenaEventItems.count > 0 && (self.arenaEvents?.monthsDictObjList.count)! > 0){ if (self.tableView != nil){ if let arrVisibleRows = self.tableView.indexPathsForVisibleRows as? [IndexPath]{ if (self.tableView.indexPathsForVisibleRows!.count > 0){ let indexP = arrVisibleRows[0] // 后续逻辑... } } } }
重构思路:用guard提前拦截无效情况,避免嵌套
核心思路是把每个“不满足就退出”的条件都用guard处理,这样所有有效逻辑都会放在同一层级,再也不用层层缩进了。
重构后的代码如下:
// 1. 先确保arenaEventItems存在且非空 guard let arenaEventItems = arenaEventItems, !arenaEventItems.isEmpty else { return } // 2. 确保arenaEvents的monthsDictObjList存在且非空,避免强制解包 guard let monthsDictObjList = self.arenaEvents?.monthsDictObjList, !monthsDictObjList.isEmpty else { return } // 3. 确保tableView存在 guard let tableView = self.tableView else { return } // 4. 确保可见行的indexPaths存在、能转成[IndexPath]且非空 guard let visibleIndexPaths = tableView.indexPathsForVisibleRows as? [IndexPath], !visibleIndexPaths.isEmpty else { return } // 所有条件都满足后,直接写逻辑,没有嵌套! let indexP = visibleIndexPaths[0] // 后续逻辑...
为什么这样更优?
- 消除嵌套:所有前置判断都提前返回,有效逻辑在同一层级,可读性拉满
- 避免强制解包:用
guard let安全处理所有可选值,再也不用!冒险 - 逻辑清晰:每个
guard都对应一个明确的前置条件,别人一看就知道哪些情况会提前退出 - 符合Swift风格:Swift推荐用
guard做前置校验,比嵌套if更优雅
你之前说用guard let遇到瓶颈,大概率是没把多个条件拆分处理,或者没结合isEmpty(比count > 0更高效且语义更清晰)。现在这样拆分后,是不是清爽多啦?
内容的提问来源于stack exchange,提问作者Priyanka Wadher Mistry
相关产品推荐
相关产品推荐

