Swift中检查可选字符串非空的规范写法是哪种?
两种写法的正确性结论
两种写法语法和运行逻辑都完全正确,都能实现「newItem.item非空且长度大于0时才进入分支」的需求,不存在功能性bug。
- 第一种空合运算符写法:
if newItem.item?.count ?? 0 > 0 { ... }
逻辑是当newItem.item为nil时,??会把左侧可选值替换为0,0不满足>0的条件,分支不触发;当newItem.item有值时,会正常读取count属性做判断,逻辑完全符合预期。 - 第二种可选绑定写法:
逻辑是先尝试解包if let current = newItem.item, current.count > 0 { // 分支逻辑 }newItem.item,解包失败(值为nil)直接跳过分支;解包成功后再判断长度是否大于0,和第一种写法逻辑完全等价。
社区通用规范推荐
Swift官方指南及主流开发社区更推荐使用可选绑定的写法,核心原因有三点:
- 逻辑分层清晰:解包操作和值校验操作拆分明确,后续如果要新增判断条件(比如判断字符串包含特定字符、匹配特定前缀等),直接在后面通过逗号追加条件即可,不需要改动原有代码结构。
- 避免冗余解包:进入分支后拿到的
current是已经解包完成的非可选字符串,你要对字符串调用相关函数时可以直接使用,不需要再重复写解包逻辑,也从根源上避免了强制解包带来的崩溃风险。 - 可读性更强:不需要阅读者额外推导空合运算符在这里的取值逻辑,扫一眼就能明确两步判断的作用,后续维护成本更低。
额外提一个字符串判断的优化点:如果你判断count > 0的目的只是校验字符串非空,建议替换为!current.isEmpty。对Swift的String类型来说,count需要遍历整个字符串计算字符总数,长字符串场景下有额外性能开销,而isEmpty仅需要判断字符串的起止索引是否相等,性能更高,也是社区判断字符串非空的标准写法。优化后的标准实现如下:
if let current = newItem.item, !current.isEmpty { // 在此处直接调用current的相关函数即可 }
第一种空合运算符的写法并非错误,如果你只是需要做条件判断、分支内完全不会用到这个字符串本身,这种简洁写法也完全可以用,只需要注意不要为了追求短代码牺牲后续维护的便利性即可。
内容的提问来源于stack exchange,提问作者Bartender1382
相关产品推荐
相关产品推荐

