[swift-evolution] Required Callback

Xiaodi Wu xiaodi.wu at gmail.com
Tue Aug 16 12:05:28 CDT 2016


Well, the callsite @required would be what I call your escape hatch :)

Hmm, lemme think on this...
On Tue, Aug 16, 2016 at 11:59 James Campbell <james at supmenow.com> wrote:

> It would though, look :) :
>
> Backend.run() { requiredCallback in
>
>  NonAnotatedModuled({
>
> //We send a anon closure to the module and we call the callback with a
> required specifier to indicate to the compiler it will be called :)
> @required requiredCallback()
> })
> }
>
> This would be the same as this:
>
>
> Backend.run() { requiredCallback in
>
>  AnotatedModuled(requiredCallback)
> }
>
> And this:
>
>
> Backend.run() { requiredCallback in
>
> @required requiredCallback()
> }
>
> *___________________________________*
>
> *James⎥Lead Hustler*
>
> *james at supmenow.com <james at supmenow.com>⎥supmenow.com
> <http://supmenow.com>*
>
> *Sup*
>
> *Runway East *
>
> *10 Finsbury Square*
>
> *London*
>
> * EC2A 1AF *
>
> On 16 August 2016 at 17:55, Xiaodi Wu <xiaodi.wu at gmail.com> wrote:
>
>> Wait, doesn't work. Your anonymous closure would then be dinged for not
>> satisfying the requirement. Turtles all the way down. Still need an escape
>> hatch.
>>
>> On Tue, Aug 16, 2016 at 11:54 James Campbell <james at supmenow.com> wrote:
>>
>>> I'll write up a draft proposal :) I think we have something nice :)
>>>
>>> *___________________________________*
>>>
>>> *James⎥Lead Hustler*
>>>
>>> *james at supmenow.com <james at supmenow.com>⎥supmenow.com
>>> <http://supmenow.com>*
>>>
>>> *Sup*
>>>
>>> *Runway East *
>>>
>>> *10 Finsbury Square*
>>>
>>> *London*
>>>
>>> * EC2A 1AF *
>>>
>>> On 16 August 2016 at 17:54, Xiaodi Wu <xiaodi.wu at gmail.com> wrote:
>>>
>>>> Nicer still!
>>>>
>>>> On Tue, Aug 16, 2016 at 11:53 James Campbell <james at supmenow.com>
>>>> wrote:
>>>>
>>>>> I guess that would make sense and you could wrap the callback up in a
>>>>> anon-closure if the module hadn't adpated the @required property so you get
>>>>> both compatibility, safety and clarity.
>>>>>
>>>>> *___________________________________*
>>>>>
>>>>> *James⎥Lead Hustler*
>>>>>
>>>>> *james at supmenow.com <james at supmenow.com>⎥supmenow.com
>>>>> <http://supmenow.com>*
>>>>>
>>>>> *Sup*
>>>>>
>>>>> *Runway East *
>>>>>
>>>>> *10 Finsbury Square*
>>>>>
>>>>> *London*
>>>>>
>>>>> * EC2A 1AF *
>>>>>
>>>>> On 16 August 2016 at 17:50, Haravikk <swift-evolution at haravikk.me>
>>>>> wrote:
>>>>>
>>>>>>
>>>>>> On 16 Aug 2016, at 15:49, Xiaodi Wu via swift-evolution <
>>>>>> swift-evolution at swift.org> wrote:
>>>>>>
>>>>>> I can see the use case, but it'd be annoying (or, impossible) to work
>>>>>> around if I intend to call `end` by passing it to a helper function in
>>>>>> another (let's say, precompiled) module. There's no way for the compiler to
>>>>>> inspect that `end` is always called by that other module, and if calling
>>>>>> `end` twice causes bad things to happen, I'm totally out of luck. You'd
>>>>>> need a companion annotation to pass along the requirement to the callee, or
>>>>>> some sort of force-unrequire, but the latter can't have teeth (i.e. can't
>>>>>> enforce at runtime) if the closure is escaping.
>>>>>> On Tue, Aug 16, 2016 at 08:39 James Campbell via swift-evolution <
>>>>>> swift-evolution at swift.org> wrote:
>>>>>>
>>>>>>> It would be handy if a callback could be marked as required with an
>>>>>>> optional descriptive message i.e
>>>>>>>
>>>>>>> class BackgroundTask {
>>>>>>>  func run(end: @required("You must call end otherwise iOS will
>>>>>>> penalise your app for being a bad citizen") () -> Void)
>>>>>>> }
>>>>>>>
>>>>>>> That was the developer can comunicate the bad things that can happen
>>>>>>> if this callback isn't called such as iOS peanlizing them for not ending a
>>>>>>> background task or perhaps memory leaks caused by clean up code unable to
>>>>>>> be triggered.
>>>>>>>
>>>>>>
>>>>>> Could this not just behave in the same way as @noescape, in which
>>>>>> case you can pass the closure on to other functions so long as they also
>>>>>> have the @noescape attribute? In this case passing it as a parameter to
>>>>>> another method with the @required attribute would be equivalent to calling
>>>>>> it directly (since you know the other method must eventually call it).
>>>>>>
>>>>>
>>>>>
>>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-evolution/attachments/20160816/f4beb1fb/attachment.html>


More information about the swift-evolution mailing list