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

关于UINavigationController中removeAll闭包判断逻辑的疑问

关于UINavigationController.viewControllers.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 20:05:17