关于UINavigationController中removeAll闭包判断逻辑的疑问
核心问题出在逻辑运算符的组合和德摩根定律的应用上,结合removeAll(where:)的工作规则(闭包返回true的元素会被移除),我们来拆解两种写法的差异:
原代码的逻辑分析
原闭包返回语句:
!(navigationViewController.isKind(of: MainTabbarViewController.self)) || !(navigationViewController.isKind(of: PaybillViewController.self))
用逻辑符号简化:设A = 控制器是MainTabbarViewController,B = 控制器是PaybillViewController,则表达式等价于 !A || !B。
根据逻辑运算规则,只要满足不是MainTabbarVC,或者不是PaybillVC的任意一个条件,该控制器就会被移除。结合你的导航栈[MainTabbarVC, PaybillTransactionVC, PaybillPreviewVC, PaybillSummaryVC, PaybillVC]逐一判断:
- MainTabbarVC:
!A为false,!B为true →false || true = true→ 被移除 - PaybillVC:
!A为true,!B为false →true || false = true→ 被移除 - 中间三个VC:
!A和!B都为true →true || true = true→ 被移除
最终整个导航栈被清空,导致黑屏,甚至MainTabbarVC的子控制器被销毁。
修改后代码的逻辑分析
修改后的闭包返回语句:
!(navigationViewController.isKind(of: MainTabbarViewController.self) || navigationViewController.isKind(of: PaybillViewController.self))
等价于 !(A || B),根据德摩根定律,这可以转换为 !A && !B——意思是既不是MainTabbarVC,也不是PaybillVC的控制器才会被移除。
同样结合导航栈判断:
- MainTabbarVC:
A || B为true →!(A || B)为false → 不被移除 - PaybillVC:
A || B为true →!(A || B)为false → 不被移除 - 中间三个VC:
A || B为false →!(A || B)为true → 被移除
最终导航栈保留[MainTabbarVC, PaybillVC],功能恢复正常。
关键知识点
removeAll(where:):数组的该方法会遍历所有元素,移除闭包返回true的元素,不要搞反成保留返回true的元素。- 德摩根定律:逻辑运算的基础规则,
!(A || B) = !A && !B,!(A && B) = !A || !B,在组合复杂条件时必须遵守,否则会出现完全相反的逻辑结果。
内容的提问来源于stack exchange,提问作者Noppakun Anantakitthawon
相关产品推荐
相关产品推荐

