> On Dec 24, 2015, at 2:56 AM, Colin Cornaby <[email protected]> wrote:
> 
>> And my two cents is:
>> 
>> NSError is antiquated, and enums conforming to ErrorType, with associated 
>> types on the case values, are much better. They are cleaner, they are easier 
>> to use, and they are nicer to look at.
> 
> And I still think that’s a platform choice. If a platform wants to define 
> it’s errors as a Swift enum, or if a developer is defining their own 
> independent platform, that’s a semi-reasonable thing to do. But I think 
> trying to force all the platforms (Apple and non-Apple) into an enum shaped 
> box for cross platform Swift is going to be problematic. If the authors of 
> Cocoa want to begin defining all their errors as enums, the ball is certainly 
> in their court, but it doesn’t feel right to me to promote that up to a 
> language concern.
> 
> Before multiplatform Swift, I was totally onboard with the idea of 
> supercharging ErrorType, but the more I think about it, and the more I look 
> at lower level stuff that we could begin using Swift for on other platforms, 
> the more I think having larger error types needs to be a decision made by the 
> host platform API on a case by case basis. And I’m not convinced an enum is 
> an appropriate error tool for all cases, even though it is certainly 
> appropriate for a lot of cases.

That’s a bit of a non-sequitur, though. Since ErrorType is a protocol, it can 
be anything. It can be an enum, a struct, a class, whatever you want. No one’s 
forcing enums, or anything really; enum just happens to be, in my opinion, the 
nicest of these to use. Someone else in the thread disagreed and preferred 
structs. That’s all fine; the whole point of ErrorType is that you can use what 
you want; there should just be a nicer way to bridge these things, in whatever 
form you prefer them, to NSError, so that we’re not forcing anyone into an 
NSError-shaped box.

> I do think there are some weird sharp edges around NSError/ErrorType that 
> aren’t specific to NSError, and will continue cutting people’s fingers on 
> other platforms (for example, if I had a C API that defined it’s own error 
> type as a struct, I’d be having a lot of the same problems.) I haven’t been 
> able to come up with any reasonable ideas though that would fix everything.
> 
> One thing I think could be done is that NSError could somehow be made to 
> conform to RawRepresentable, which would then take care of a lot of this.
> 
> The code could then become:
> enum MyError: NSError {
>     case JustFouledUp(domain: .., code: .., userInfo: ..)
>     case CouldntDealWithFile(domain: .., code: .., userInfo: ..)
>     case CouldntDealWithSomeValue(domain: .., code: .., userInfo: ..)
> }

This is impossible, because enums with raw values can’t have cases with 
arguments. Try it: it won’t compile.

> …with no need for the functions to implement to provide out the other usual 
> data. I know some consider the NSError initializers kind of awful, that’s 
> something that could be dealt with at the NSError API level. I actually think 
> the above looks a lot cleaner, although I know I skipped over some of the 
> mess with ellipsis. And API developers don’t have to implement manual, hand 
> rolled bridging.
> 
> This seems cleanest to me, and would carry going forward with Error in OSS 
> Foundation.

Honestly, I can’t imagine anyone *not* finding the NSError initializers awful. 
It’s a truly cringe-worthy API. Beyond that, forcing every error object, even 
ones that are never touching Obj-C code at all, to be backed by a bulky NSError 
object is pretty unreasonable, IMO. I’d much prefer to store the error data 
using lean and mean Swift-native constructs, and bridge to NSError only when 
it’s needed to interact with AppKit/UIKit.

Charles

_______________________________________________
swift-evolution mailing list
[email protected]
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to