> 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.

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: ..)
}

…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.
_______________________________________________
swift-evolution mailing list
[email protected]
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to