移除强制解包:函数改写正确性验证及懒加载变量改写咨询
问题解答
一、getLanguageCode()的改写是否正确?
完全正确!咱们来拆解下为什么:
- 原代码里的
Locale.current.languageCode!用了强制解包!,如果系统返回的languageCode是nil(虽然这种情况极少,但并非不可能),你的程序会直接崩溃。 - 改写后的代码把返回类型改成了
String?(可选字符串),用if let做安全绑定,只有当languageCode有值时才返回它,否则返回nil。这种写法完全规避了强制解包的风险,是更安全、更符合Swift最佳实践的写法。
二、懒加载变量commonErrorList移除强制解包的改写方案
原代码里的path!是潜在的崩溃点——如果找不到名为CommonErrorCodes.plist的文件,path会是nil,强制解包直接触发崩溃。我们可以用安全绑定来替换强制解包,改写后的代码如下:
方案1:用guard let提前退出(推荐,逻辑更清晰)
lazy var commonErrorList: [String: AnyObject]? = { guard let path = Bundle.main.path(forResource: "CommonErrorCodes", ofType: "plist") else { // 找不到文件时直接返回nil return nil } // 文件路径存在时再尝试加载,NSDictionary(contentsOfFile:)本身也会在解析失败时返回nil return NSDictionary(contentsOfFile: path) as? [String: AnyObject] }()
方案2:用if let条件绑定
lazy var commonErrorList: [String: AnyObject]? = { if let path = Bundle.main.path(forResource: "CommonErrorCodes", ofType: "plist") { return NSDictionary(contentsOfFile: path) as? [String: AnyObject] } // 路径不存在时返回nil return nil }()
改写说明:
- 去掉了
path!的强制解包,改用guard let/if let确保path有值后再继续执行; NSDictionary(contentsOfFile:)本身就会在文件不存在、格式错误时返回nil,最后转成Swift字典的可选类型,整个逻辑全程安全,不会触发运行时崩溃;- 变量的返回类型保持和原代码一致的
[String: AnyObject]?,不需要额外修改调用逻辑。
内容的提问来源于stack exchange,提问作者Sanoj Kashyap
相关产品推荐
相关产品推荐

