Re: Any way to avoid external parameter names?
Re: Any way to avoid external parameter names?
- Subject: Re: Any way to avoid external parameter names?
- From: Rick Mann <email@hidden>
- Date: Fri, 24 Oct 2014 20:31:03 -0700
> On Oct 24, 2014, at 19:55 , Quincey Morris <email@hidden> wrote:
>
> On Oct 24, 2014, at 18:38 , Rick Mann <email@hidden> wrote:
>>
>> Oh! I think I figured out what I'm doing wrong. The typealias doesn't understand local names, and that makes some sense. I can just get rid of those altogether and be find.
>
> I don’t understand what you’re saying here. What are “local names”, and what have they got to do with the type alias? As far as I can see, you’ve simply left out something required.
"local names" are the names a function implementation uses to refer to parameters. In the case of the typealias, I had copied-and-pasted it from one of my function declarations when things were getting too unwieldy. I didn't realize at the time that the local names become external names in a function type declaration.
>
>> typealias SendResponseFunc = (inResp: NSData?, inRespHeaders: HTTPHeaders?) -> ();
>>
>>
>> func
>> waitForSweep(inSendResponse: SendResponseFunc)
>> {
>> inSendResponse(nil, nil); // Missing argument labels 'inResp:inRespHeaders'
>> }
>>
>> I find this "expressiveness" to be overly verbose.
>
> Can you point to the expressiveness in “this” that you regard as verbose?
>
> It’s as if you’re complaining that you’re being forced to write something like this in Obj-C:
>
> [self sendWithResponse: nil responseHeaders: nil];
>
> when you’d much rather write this:
>
> [self send: nil : nil];
That's precisely it. I find Obj-C incredibly verbose, and Swift has a more C-like function call syntax, and doesn't (necessarily) require naming all the parameters at the call site.
> You *can* do the latter (with a suitable method declaration), of course, but it’s not a usual coding style. Still, I don’t recall you ever complaining that Obj-C “forces” you to write keywords in method signatures.
>
> Actually, Swift optimizes this from the opposite end. Corresponding to this declaration in Obj-C:
>
> - (void) sendWithResponse: (NSData*) response responseHeaders: (HTTPHeaders*) responseHeaders;
>
> which basically duplicates the keywords in the parameter variable names, Swift lets you eliminate the duplication:
>
> func send (response: NSData, responseHeaders: HTTPHeaders) … etc …
>
> If you want to write C-like functions without keywords, you *can* do that, using the “_” decoration. If you want to name your parameter variables something different from the keyword (“inResp” vs “response”), you can do that too, but both of these (slightly unusual) cases take more syntax.
That's only true in an actual function or method definition. But you can't do that in a Tuple, even one that's part of a function typealias declaration (I don't know if that's intentional or not). It sorta makes sense, since there's nothing at the declaration that needs a local name. But it also means that you can't just copy-and-paste as I did, and that the two declarations that are very similar are actually different.
Anyway, once I realized what was going on, I was able to get the behavior I wanted. It's not perfect, because now I have to declare my function types like this to get some documentation in them. I want to document at the function declaration, not at every call site.
typealias SyncRequestHandler = (/*request:*/ HTTPMessage) -> ResponseTuple;
typealias SendResponseFunc = (/*responseData:*/ NSData?, /*responseHeaders:*/ HTTPHeaders?) -> ();
You can't prefix these names with "_" in the current compiler.
--
Rick Mann
email@hidden
_______________________________________________
Cocoa-dev mailing list (email@hidden)
Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com
Help/Unsubscribe/Update your Subscription:
This email sent to email@hidden