> On May 2, 2016, at 3:43 PM, Joe Groff <jgr...@apple.com> wrote:
> 
> 
>> On May 2, 2016, at 2:45 PM, Chris Lattner <clatt...@apple.com> wrote:
>> 
>> On Apr 29, 2016, at 3:00 PM, Joe Groff via swift-evolution 
>> <swift-evolution@swift.org> wrote:
>>> I’d like to propose the following changes:
>>> 
>>>     • Dynamic casts as?, as! and is should no longer perform bridging 
>>> conversions between value types and Cocoa classes.
>>>     • Coercion syntax as should no longer be used to explicitly force 
>>> certain bridging conversions.
>>>     • To replace this functionality, we should add initializers to bridged 
>>> value types and classes that perform the value-preserving bridging 
>>> operations.
>> +1.  I think that this will lead to a much cleaner and more predictable set 
>> of rules.  It will probably also define away a ton of bugs in the compiler 
>> and runtime.
>> 
>> 
>> 
>>> NSError bridging can also be extracted from the runtime, and the same 
>>> functionality exposed as a factory initializer on NSError:
>>> 
>> I think that this proposal is overall really great, but what does it do to 
>> the “catch let x as NSError” pattern?  What is the replacement?  If the 
>> result is ugly, we may have to subset out NSError out of this pass, and 
>> handle it specifically with improvements to the error bridging story.
>> 
> 
> If we remove the bridging magic and do nothing else, then the best you can do 
> to catch any error and handle it as an NSError becomes a two-liner:
> 
>       do {
>         try something()
>       } catch let error {
>         let nsError = NSError(error)
>         handle(nsError)
>       }
> 
> That's definitely uglier, but just to play devil's advocate, this does have 
> the benefit of making it much clearer that the 'catch' is exhaustive. 'as' 
> patterns are usually refutable, and it's a weird exception that 'error as 
> NSError' is an exhaustive match (and we do have bugs where we get this wrong, 
> especially inside closures when we haven't fully propagated contextual types 
> yet).

Right, that’s what I expected.  The problem here is that this is a super common 
pattern.  The solution to this is pretty straight-forward though: we should 
just make the most commonly used members of NSError be a protocol extension on 
ErrorProtocol (née ErrorType).  This would eliminate the most common reasons 
that people need this pattern.  Do you know of any issues with this, or are we 
merely a proposal away from making this happen?

-Chris
_______________________________________________
swift-evolution mailing list
swift-evolution@swift.org
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to