Guh, second version should be this (Discourse save me).
enum MyError: Error {
case network
case json
case value
var localizedDescription: String {
switch self {
case .network: return "first"
case .json: return "second"
case .value: return "third"
}
}
}
extension MyError: LocalizedError { }
print((MyError.value as Error).localizedDescription)
> On Feb 28, 2017, at 4:36 PM, Jon Shier <[email protected]> wrote:
>
> Something strange I just observed. This version of MyError properly prints
> its localized description (in a Playground).
>
> enum MyError: Error {
>
> case network
> case json
> case value
>
> var localizedDescription: String {
> switch self {
> case .network: return "first"
> case .json: return "second"
> case .value: return "third"
> }
> }
>
> var errorDescription: String? { return localizedDescription }
>
> }
>
> extension MyError: LocalizedError { }
>
> print((MyError.value as Error).localizedDescription): third
>
> However, this version does not:
>
> enum MyError: Error {
>
> case network
> case json
> case value
>
> var localizedDescription: String {
> switch self {
> case .network: return "first"
> case .json: return "second"
> case .value: return "third"
> }
> }
>
> var errorDescription: String? { return localizedDescription }
>
> }
>
> extension MyError: LocalizedError { }
>
> print((MyError.value as Error).localizedDescription): The operation couldn’t
> be completed. (__lldb_expr_103.MyError error 2.)
>
> Surely that’s a bug?
>
>
>
> Jon
>
>> On Feb 28, 2017, at 4:32 PM, Jon Shier <[email protected]
>> <mailto:[email protected]>> wrote:
>>
>> Sorry, I forgot that part; MyError does conform to LocalizedError. However,
>> even if it didn’t, Error has a localizedDescription property, so my question
>> was why my implementation of that property wasn’t used in favor of the
>> generated one. Or is that not the case for properties that aren’t required
>> by the protocol? Even with the conformance, treating MyError as Error or
>> LocalizedError doesn’t return the correct value for the property.
>> localizedDescription seems to work fine when talking to Error instances
>> backed by NSError though. This behavior doesn’t seem to be correct,
>> otherwise there’s no way to get a useful description out of a custom Error
>> without also implementing LocalizedError and treating the value as that type
>> instead.
>>
>>
>>
>> Jon
>>
>>
>>> On Feb 28, 2017, at 4:10 PM, Jordan Rose <[email protected]
>>> <mailto:[email protected]>> wrote:
>>>
>>> 'localizedDescription' isn't a requirement of the Error protocol, which
>>> means it's not a customization point. You need to actually conform to
>>> LocalizedError and provide a valid 'errorDescription' instead.
>>>
>>> (It's too bad that your second test works at all, since MyError doesn't
>>> conform to LocalizedError. Unfortunately NSError does conform to
>>> LocalizedError, and all Errors can be bridged to NSError.)
>>>
>>> If you're interested, you can find more information about the design in its
>>> proposal, SE-0112
>>> <https://github.com/apple/swift-evolution/blob/master/proposals/0112-nserror-bridging.md>.
>>>
>>> Hope this helps,
>>> Jordan
>>>
>>>
>>>> On Feb 28, 2017, at 12:54, Jon Shier via swift-users
>>>> <[email protected] <mailto:[email protected]>> wrote:
>>>>
>>>> Swifters:
>>>> I have a custom error enum:
>>>>
>>>> enum MyError: Error {
>>>>
>>>> case network(error: Error)
>>>> case json(error: Error)
>>>> case value(error: Error)
>>>>
>>>> var localizedDescription: String {
>>>> switch self {
>>>> case let .network(error): return error.localizedDescription
>>>> case let .json(error): return error.localizedDescription
>>>> case let .value(error): return error.localizedDescription
>>>> }
>>>> }
>>>>
>>>> }
>>>>
>>>> However, the localizedDescription output is odd to me. When the value is
>>>> treated as:
>>>>
>>>> Error: po error.localizedDescription
>>>> "The operation couldn’t be completed. (MyApp.MyError error 1.)”
>>>>
>>>> LocalizedError: po (error as! LocalizedError).localizedDescription
>>>> "The operation couldn’t be completed. (MyApp.MyError error 1.)”
>>>>
>>>> MyError: Error: po (error as! MyError).localizedDescription
>>>> "JSON could not be serialized because of error:\nThe data couldn’t be read
>>>> because it isn’t in the correct format."
>>>>
>>>> Shouldn’t my implementation of localizedDescription take precedence in all
>>>> cases here? (This is Xcode 8.3b3).
>>>>
>>>>
>>>>
>>>> Jon
>>>> _______________________________________________
>>>> swift-users mailing list
>>>> [email protected] <mailto:[email protected]>
>>>> https://lists.swift.org/mailman/listinfo/swift-users
>>>> <https://lists.swift.org/mailman/listinfo/swift-users>
>>>
>>
>
_______________________________________________
swift-users mailing list
[email protected]
https://lists.swift.org/mailman/listinfo/swift-users