情景: 记录数组中的最大值。
思路: 使用 last
来存放之前的最大值,使用 new
表示新的值,通过判断两者的大小来决定是否更新最大值 last
。
- 最直接
// 如果 last 为空,或者 last 小于 new 的时候更新
if last == nil || (last != nil && new > last) {
last = new
}
复制代码
n 个条件,对应2^n 个分支
上面的表达式中,实际上描述了 2^2 = 4 个分支中的 3 个,因此可以通过最后一个分支的逻辑非来简化:
- 逻辑非
// 如果 last 不为空,且大于 new,就无需更新。取逻辑非就是需要更新。
if !(last != nil && new <= last) {
last = new
}
复制代码
基于语言的一些语法特性,我们在代码里更常见的是 占位法。
- 占位法
// 回顾更新数据的条件:last == nil || new > last
// 将 last == nil 的情况改成能使第二个式子:new > last 恒成立的方式,实现两个命题的整合。
if new > last ?? MIN { // MIN 是一个一定比 new 小的值
last = new
}
复制代码