New start task: https://bugs.swift.org/browse/SR-4405 
<https://bugs.swift.org/browse/SR-4405> Add @escaping to 
RecoverableError.attemptRecovery


> On Mar 28, 2017, at 3:31 PM, Douglas Gregor <dgre...@apple.com> wrote:
> 
> 
>> On Mar 28, 2017, at 11:21 AM, Michael Ilseman <milse...@apple.com 
>> <mailto:milse...@apple.com>> wrote:
>> 
>> CC Doug Gregor, who git blame tells me wrote this part.
>> 
>> Doug, this slightly predates noescape-by-default. Is this a bug or as 
>> intended?
> 
> It’s a bug; the point here is that we can do recovery asynchronously, so it 
> should be @escaping. We missed the annotation when noescape-by-default landed.
> 
>       - Doug
> 
>> 
>> 
>>> On Mar 28, 2017, at 8:49 AM, Elia Cereda via swift-users 
>>> <swift-users@swift.org <mailto:swift-users@swift.org>> wrote:
>>> 
>>> Hi Dennis,
>>> 
>>> Thanks for your answer. I can see that my message needs some more context: 
>>> RecoverableError is a protocol in the standard library that can be 
>>> implemented to opt in to the error recovery mechanism available on macOS. 
>>> attemptRecovery(optionIndex, resultHandler:) is one of the methods that 
>>> have to be implemented to conform to the protocol.
>>> 
>>> Here you can find the other ones:
>>> 
>>> /// Describes an error that may be recoverable by presenting several
>>> /// potential recovery options to the user.
>>> public protocol RecoverableError : Error {
>>> 
>>>     /// Provides a set of possible recovery options to present to the user.
>>>     public var recoveryOptions: [String] { get }
>>> 
>>>     /// Attempt to recover from this error when the user selected the
>>>     /// option at the given index. This routine must call handler and
>>>     /// indicate whether recovery was successful (or not).
>>>     ///
>>>     /// This entry point is used for recovery of errors handled at a
>>>     /// "document" granularity, that do not affect the entire
>>>     /// application.
>>>     public func attemptRecovery(optionIndex recoveryOptionIndex: Int, 
>>> resultHandler handler: (Bool) -> Swift.Void)
>>> 
>>>     /// Attempt to recover from this error when the user selected the
>>>     /// option at the given index. Returns true to indicate
>>>     /// successful recovery, and false otherwise.
>>>     ///
>>>     /// This entry point is used for recovery of errors handled at
>>>     /// the "application" granularity, where nothing else in the
>>>     /// application can proceed until the attempted error recovery
>>>     /// completes.
>>>     public func attemptRecovery(optionIndex recoveryOptionIndex: Int) -> 
>>> Bool
>>> }
>>> 
>>> As you can see, there are two attemptRecovery methods. In my mind the first 
>>> one was meant to be used for asynchronous operations, where you run some 
>>> recovering code in background and then report its result back to the caller.
>>> 
>>> The problem is that the handler is not marked as @escaping and as such it 
>>> can only be used inside the body of attemptRecovery. I was wondering if 
>>> this was an oversight from the stdlib team or if this was a deliberate 
>>> design decision.
>>> 
>>> I just saw that the method is still not marked as @escaping in master 
>>> (https://github.com/apple/swift/blob/master/stdlib/public/SDK/Foundation/NSError.swift#L105
>>>  
>>> <https://github.com/apple/swift/blob/master/stdlib/public/SDK/Foundation/NSError.swift#L105>),
>>>  so I’d like to know what its intended use case is, since the obvious one 
>>> (asynchronous recovery) is prevented by the missing annotation.
>>> 
>>> Thanks,
>>> Elia Cereda
>>> 
>>>> Il giorno 28 mar 2017, alle ore 17:33, Dennis Weissmann 
>>>> <den...@dennisweissmann.me <mailto:den...@dennisweissmann.me>> ha scritto:
>>>> 
>>>> Hey Elia,
>>>> 
>>>> I'm currently on mobile and don't really know what you're talking about 
>>>> (what is RecoverableError?) but you say it's a block, and if the closure 
>>>> is optional, it is @escaping by default.
>>>> 
>>>> Did you see 
>>>> https://lists.swift.org/pipermail/swift-users/Week-of-Mon-20160905/003185.html
>>>>  
>>>> <https://lists.swift.org/pipermail/swift-users/Week-of-Mon-20160905/003185.html>
>>>> 
>>>> - Dennis
>>>> 
>>>> Sent from my iPhone
>>>> 
>>>> On 23. Mar 2017, at 10:07 AM, Elia Cereda via swift-users 
>>>> <swift-users@swift.org <mailto:swift-users@swift.org>> wrote:
>>>> 
>>>>> I'd like to bump this issue, since it has been some time and it hasn't 
>>>>> been addressed.
>>>>> 
>>>>> Thanks,
>>>>> Elia Cereda
>>>>> 
>>>>> Il giorno 03 mar 2017, alle ore 21:33, Elia Cereda <eliacer...@gmail.com 
>>>>> <mailto:eliacer...@gmail.com>> ha scritto:
>>>>> 
>>>>>> I’m wondering why the resultHandler block on 
>>>>>> RecoverableError.attemptRecovery(optionIndex, resultHandler:) is not 
>>>>>> marked @escaping?
>>>>>> 
>>>>>> I’m trying to invoke some recovering code that executes asynchronously, 
>>>>>> then reports if it was successful or not and I thought that this was the 
>>>>>> right strategy. As far as I can tell, without @escaping that method 
>>>>>> loses all it’s purpose and becomes essentially equivalent to 
>>>>>> attemptRecovery(optionIndex:).
>>>>>> 
>>>>>> So, I’d like to ask.
>>>>>> 1. Is it a bug or that method is non-escaping on purpose?
>>>>>> 2. If it is a bug, is there a workaround that can be applied pending a 
>>>>>> fix in a future version of Swift?
>>>>>> 3. If it was a deliberate decision, what's the supported method of 
>>>>>> asynchronously invoking error recovery code?
>>>>>> 
>>>>>> Seeing that this wasn’t changed in Xcode 8.3b2, I think it unlikely that 
>>>>>> this was an oversight.
>>>>>> 
>>>>>> Thanks,
>>>>>> Elia Cereda
>>>>>> 
>>>>> _______________________________________________
>>>>> swift-users mailing list
>>>>> swift-users@swift.org <mailto:swift-users@swift.org>
>>>>> https://lists.swift.org/mailman/listinfo/swift-users 
>>>>> <https://lists.swift.org/mailman/listinfo/swift-users>
>>> 
>>> _______________________________________________
>>> swift-users mailing list
>>> swift-users@swift.org <mailto:swift-users@swift.org>
>>> https://lists.swift.org/mailman/listinfo/swift-users 
>>> <https://lists.swift.org/mailman/listinfo/swift-users>
>> 
> 

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

Reply via email to