Fix `(nsError as Error).localizedDescription` output (#967)
Because NSError is not `LocalizedError` and `_swift_Foundation_getErrorDefaultUserInfo` does not handle NSError instances, `(nsError as Error).localizedDescription` didn't return expected output. So let's handle NSError case in `Error.localizedDescription` implementation.
diff --git a/Foundation/NSError.swift b/Foundation/NSError.swift
index ffc19ce..bee29e3 100644
--- a/Foundation/NSError.swift
+++ b/Foundation/NSError.swift
@@ -285,7 +285,11 @@
public extension Error {
/// Retrieve the localized description for this error.
var localizedDescription: String {
- let defaultUserInfo = _swift_Foundation_getErrorDefaultUserInfo(self) as! [String : Any]
+ if let nsError = self as? NSError {
+ return nsError.localizedDescription
+ }
+
+ let defaultUserInfo = _swift_Foundation_getErrorDefaultUserInfo(self) as? [String : Any]
return NSError(domain: _domain, code: _code, userInfo: defaultUserInfo).localizedDescription
}
}
diff --git a/TestFoundation/TestNSError.swift b/TestFoundation/TestNSError.swift
index 516f5d3..43c9a47 100644
--- a/TestFoundation/TestNSError.swift
+++ b/TestFoundation/TestNSError.swift
@@ -22,6 +22,7 @@
static var allTests: [(String, (TestNSError) -> () throws -> Void)] {
return [
("test_LocalizedError_errorDescription", test_LocalizedError_errorDescription),
+ ("test_NSErrorAsError_localizedDescription", test_NSErrorAsError_localizedDescription),
]
}
@@ -33,4 +34,10 @@
let error = Error()
XCTAssertEqual(error.localizedDescription, "error description")
}
+
+ func test_NSErrorAsError_localizedDescription() {
+ let nsError = NSError(domain: "", code: 0, userInfo: [NSLocalizedDescriptionKey: "Localized!"])
+ let error = nsError as Error
+ XCTAssertEqual(error.localizedDescription, "Localized!")
+ }
}