Swift中使用localizedDescription报错:Error类型无该成员
问题原因
你遇到的错误是因为Swift的Error协议本身并没有定义localizedDescription属性——这个属性属于**LocalizedError协议**(它是Error的子协议)。默认catch块里捕获的error变量类型是Error,所以直接访问localizedDescription会触发编译错误。
另外你的代码还有两个隐藏问题:
- 自定义的
errors枚举只遵循了Error,没有实现LocalizedError,所以就算你捕获到自定义错误,也没法直接用本地化描述 checkPassword函数存在路径缺失:当密码长度在5-9之间时,函数没有返回值,这会导致编译失败
解决方案
1. 让自定义错误遵循LocalizedError
修改你的错误枚举,让它遵循LocalizedError并实现errorDescription属性,系统会基于这个属性自动生成localizedDescription:
enum PasswordError: Error, LocalizedError { case tooShort, tooObvious var errorDescription: String? { switch self { case .tooShort: return "密码长度过短,至少需要5位" case .tooObvious: return "这个密码太容易被猜到了,请更换" } } }
(顺便把枚举名改成Swift规范的大写开头命名PasswordError)
2. 修正checkPassword函数的返回逻辑
补全所有分支的返回值,避免编译错误:
func checkPassword(_ passwordEntered: String) throws -> String { if passwordEntered.count < 5 { throw PasswordError.tooShort } if passwordEntered == "12345" { throw PasswordError.tooObvious } if passwordEntered.count >= 10 { return "密码设置成功。" } // 补全5-9位密码的返回分支 return "密码强度一般,建议使用10位以上的密码。" }
3. 在默认catch块中安全访问本地化描述
如果要在默认catch块中访问localizedDescription,需要先把error转为LocalizedError类型:
do { let result = try checkPassword(myPassword) print(result) } catch PasswordError.tooShort { print("密码太短了。") } catch PasswordError.tooObvious { print("五岁小孩都能猜到这个密码!") } catch { print("错误,请输入更强的密码。") // 安全访问本地化描述 if let localizedError = error as? LocalizedError { print("错误详情:\(localizedError.localizedDescription)") } else { print("错误详情:\(error)") } }
完整修正后的代码
enum PasswordError: Error, LocalizedError { case tooShort, tooObvious var errorDescription: String? { switch self { case .tooShort: return "密码长度过短,至少需要5位" case .tooObvious: return "这个密码太容易被猜到了,请更换" } } } func checkPassword(_ passwordEntered: String) throws -> String { if passwordEntered.count < 5 { throw PasswordError.tooShort } if passwordEntered == "12345" { throw PasswordError.tooObvious } if passwordEntered.count >= 10 { return "密码设置成功。" } return "密码强度一般,建议使用10位以上的密码。" } let myPassword = "12345" do { let result = try checkPassword(myPassword) print(result) } catch PasswordError.tooShort { print("密码太短了。") } catch PasswordError.tooObvious { print("五岁小孩都能猜到这个密码!") } catch { print("错误,请输入更强的密码。") if let localizedError = error as? LocalizedError { print("错误详情:\(localizedError.localizedDescription)") } else { print("错误详情:\(error)") } }
内容的提问来源于stack exchange,提问作者HarshDarji
相关产品推荐
相关产品推荐

