Swift可选类型多条件判断模式有效性及短路求值确认
Swift可选类型条件判断的合法性与短路求值解析
首先,你的代码模式是合法的,而且Swift编译器确实会保证条件的执行顺序遵循短路求值规则,这一点完全可以放心。
关于短路求值的细节
Swift中的逻辑运算符||(逻辑或)和&&(逻辑与)都遵循短路求值逻辑:
- 对于
A || B:如果A为true,B会被直接跳过执行——因为只要有一个条件为true,整个表达式结果就为true,没必要再计算后面的部分。 - 对于
A && B:如果A为false,B同样会被跳过——因为逻辑与需要两个条件都为true才会返回true,前面条件不满足时后续计算没有意义。
回到你的代码条件:
if (opt == nil) || (opt?.x != 10 && opt?.y != 20) { // ... }
这里的执行逻辑非常明确:
- 首先检查
opt == nil:如果结果为true,直接进入if分支,后面的opt?.x != 10 && opt?.y != 20完全不会执行,自然不会出现可选类型解包的安全问题。 - 只有当
opt != nil时,才会执行后面的opt?.x != 10 && opt?.y != 20——此时opt已经确定是非nil状态,所以opt?.x和opt?.y的可选链调用是安全的。
小提示:代码里的潜在问题
不过你的代码存在一个编译报错的小问题:当你执行opt = MyOptional()之后,opt仍然是MyOptional?可选类型,直接写opt.x = 10会因为可选类型未解包而报错。你可以改成两种更合理的写法:
- 强制解包(此时能确保opt非nil,安全可行):
opt!.x = 10 - 利用自定义初始化器直接赋值:
opt = MyOptional(x: 10, y: 20)(前提是MyOptional有对应的初始化方法)
内容的提问来源于stack exchange,提问作者Deepak Sharma
相关产品推荐
相关产品推荐

