> On May 14, 2016, at 3:51 AM, Michael Peternell <[email protected]> 
> wrote:
> 
> For interoperability, ErrorType and NSError should be toll-free-bridged, like 
> CFStringRef and NSString. Converting between them should be a no-op at 
> runtime.

That would be technically infeasible without restricting ErrorType to reference 
types using the Objective-C runtime, which I don’t think anyone wants to do.

> I prefer runtime/ABI consistency over syntax/language consistency. 
> MyErrorType2 should be represented as an NSError with domain @"MyErrorType2", 
> whatever code is defined in that error type, and if you want userInfo you 
> have to create the beast as an NSError object in the first place. I think 
> userInfo is not visible in the Swift-enum-representation. If you want to have 
> a Swift Error representation that includes userInfo, you'd have to either 
> change the architecture or introduce special support on the language level 
> (e.g. a magic `er.userInfo` of type `Dictionary<String,AnyObject>` for every 
> `er: ErrorType` and a `er.withUserInfo(userInfo)` to add a userInfo 
> dictionary to an error type: e.g. 
> `MyErrorType2.fooConditionFound.withUserInfo([NSLocalizedDescriptionKey: 
> "that was really bad"])` and maybe even a convenience method as a protocol 
> extension like 
> `MyErrorType.fooConditionFound.withLocalizedDescription(localizedString: 
> "ReallyBad")`.

Adding a userInfo property to the protocol declaration (with a default 
implementation for those that don’t want to implement it) would solve this 
without any low-level hacking.

> And the key of a dictionary should really always be a String, not just an 
> NSObject.)

I actually agree; I used [NSObject : AnyObject] since that’s what NSError’s 
userInfo is currently defined as. Putting [String : AnyObject] in the protocol 
instead would be fine, although you’d have to do a little sanity checking in 
the bridging to filter out non-string keys from the dictionary.

> (I know if you have something like `case SpecialError(Int)` in your ErrorType 
> declaration, the above method does not work; you'd have to create an 
> NSError-subclass for it. Or maybe not? Just add a "SpecialError_arg0" key to 
> userInfo, value can be an NSNumber? There are more edge cases here but they 
> are all solvable.)
> 
> On the other hand, I don't think that enumerations in general should support 
> instance variables. One of the nice things for an enum is that I as a 
> programmer can always be sure that it *is* just an enum, and nothing else. 
> Adding iVars to enums would effectively turning enums to structs, and each 
> time I see a switch statement I'll have to think "is this really all? or is 
> there some stealth value attached to this enum? is every .MadeAMistake object 
> always the same?" Keeping the inconsistency constrained to the ErrorType is 
> much nicer than turning every enum into a struct.

Adding instance variables to enums is not necessary for this. The userInfo here 
can be implemented as a computed property, as it would be in enums (in classes 
and structs, of course, it would be up to the developer whether to make it a 
stored or computed property).

> There will always be rough edges when converting between two languages, 
> that's unavoidable. Try to translate a text that contains a lot of the words 
> "safety" and "security" into German. Good luck, they both translate to the 
> same word. And so there also cannot be a perfectly consistent translation 
> between ErrorType and NSError. If you want to achieve a good translation, 
> you'd have to change the ErrorType to something different. E.g. a special 
> language construct `def-error MyErrorType { case MadeAMistake; case 
> RanOutOfCake }` - matching works the same as now and you have a userInfo 
> property. And on non-objc-platforms, the NSError() name becomes unavailable 
> and .userInfo always returns `[:]`. I'm not saying that this would be a 
> beautiful solution; I'm saying that there is no beautiful solution to this 
> problem.


I think that creating wrappers for both directions could work pretty well if we 
had a userInfo property on ErrorType/Protocol. We’ve got one going in one 
direction already.

Charles

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

Reply via email to