【发布时间】:2022-01-23 13:22:13
【问题描述】:
我有一个enum,如下所示:
public enum MyErrorEnum: LocalizedError {
case FileNotFound(String = "Failed to find file.", file: String)
public var errorDescription: String? {
if let current = Mirror(reflecting: self).children.first {
let mirror = Mirror(reflecting: current.value);
// Initial error description.
let message = mirror.children.first?.value as? String
?? current.label ?? "Unknown-case";
var context = "";
// Iterate additional context.
var i = 0;
for associated in mirror.children {
if i >= 1 {
if let text = associated.value as? String {
context += "\n ";
if let label: String = associated.label {
context += "\(label): "
}
context += text;
}
}
i += 1;
}
return context.isEmpty ? message : (
message + " {" + context + "\n}"
);
}
return "\(self)";
}
}
用法:
do {
let path = "/path/to/file.txt";
throw MyErrorEnum.FileNotFound(
file: path
);
} catch {
print(error.localizedDescription);
}
输出:
Failed to find file. {
file: /path/to/file.txt
}
现在我想在任何实现LocalizedError 的enum 中重用errorDescription,只需将errorDescription 的逻辑移动到扩展中即可。
我应该如何改变下面的工作扩展(就上述而言)?
public enum MyErrorEnum: LocalizedError {
case FileNotFound(String = "Failed to find file.", file: String)
}
extension DONT_KNOW_WHAT_GOES_HERE where Self: LocalizedError {
public var errorDescription: String? {
// ... imagine all above logic moved here.
}
}
【问题讨论】:
-
@Sweeper 会影响实现
LocalizedError的所有内容,例如,我想要extension RawRepresentable where RawValue == String, Self: LocalizedError {}之类的东西但对于关联枚举。