Thanks for the answer. I am going to read it a few times. Back to the original question - if an object has an addTarget, will calling the non-string method name supply the object itself to the method?
On Tue, Mar 22, 2016 at 9:28 AM Luther Baker <lutherba...@gmail.com> wrote: > Thanks for posting this extended answer! > On Mon, Mar 21, 2016 at 11:34 PM Quincey Morris < > quinceymor...@rivergatesoftware.com> wrote: > >> On Mar 21, 2016, at 20:27 , Eric E. Dolecki <edole...@gmail.com> wrote: >> > >> > Quick question. If I use #selector(funcName) - does it always send an >> > argument of the obj if the func requests it or not? >> > >> > If the function being called has a typed argument of something like >> > sender:UIButton, I can reference the sender in the func. Before with a >> > string we could add the ":" to inform that it would be supplied. Now is >> it >> > implied that it will be supplied? >> >> 1. The “:” was never optional, in the sense that you could choose whether >> or not to “add” it. Obj-C @selector(funcName) and @selector(funcName:) — >> “funcName” and “funcName:” in the previous Swift — are completely unrelated >> selectors. When performing the first of these selectors, there was never a >> parameter, and when performing the second there was always a parameter. >> >> 2. Selectors don’t send messages, selectors *are* messages. They are, >> approximately, polymorphic (class-independent) method names known to the >> runtime. >> >> When performing a selector, it has always been necessary to supply the >> correct number of arguments. It was an implementation detail of the Obj-C >> runtime that omitting or oversupplying parameters would not necessarily >> crash, and this fact could be exploited sometimes. >> >> 3. The new #selector syntax specifies the method by qualified name (via >> an expression that isn’t evaluated). For example: >> >> > import Cocoa >> > >> > let x1 = #selector (NSView.addSubview(_:)) >> > >> > let v: NSView >> > let x2 = #selector (v.addSubview(_:)) >> > >> > class A: NSView >> > { >> > let x3 = #selector (addSubview(_:)) >> > } >> >> >> These 3 declarations specify the single-parameter addSubview method >> explicitly, by specifying the parameter keyword (_). They differ in the way >> they tell the compiler which class to consult to determine whether/how >> ‘addSubview:’ is declared. >> >> But Swift has additional source code forms. If it’s unambiguous which >> method is meant, you can just use the method name without keywords: >> >> > class A: NSView >> > { >> > let x4 = #selector (isDescendantOf) // OK because there is only >> one matching method >> > let x5 = #selector (addSubview) // ambiguous >> > } >> >> >> and you can use ‘as’ to specify the type of function, to distinguish >> between overloaded functions that have the same name and parameter >> keywords, but different parameter or return types. >> >> Note that x4 corresponds to Obj-C @selector(isDescendantOf:), not >> @selector(isDescendantOf). >> >> 4. Swift selectors are still polymorphic, so they aren’t tied to a class >> at runtime. For example, x1 above doesn’t mean “the selector for >> ‘addSubview:’ in class NSView". It means “the selector for method >> addSubview:, using NSView’s addSubview: method as a pattern to resolve any >> ambiguities”. You can still perform such a selector on any class that has a >> matching method, just like in Obj-C. >> >> 5. The problem being solved here is that in Obj-C the compiler can’t >> check that a selector is valid. There are two parts to this: >> >> a. It can only check that a method exists for a selector if a header file >> declaring that method is #imported into the current compilation. >> >> b. It cannot check the return type safely under any circumstances, >> leading to crashes when methods exist with the same selector but different >> return types. >> >> Swift solves the problem by requiring you to be explicit about which >> function signature the selector represents. >> >> _______________________________________________ >> >> Cocoa-dev mailing list (Cocoa-dev@lists.apple.com) >> >> 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: >> https://lists.apple.com/mailman/options/cocoa-dev/lutherbaker%40gmail.com >> >> This email sent to lutherba...@gmail.com > > _______________________________________________ Cocoa-dev mailing list (Cocoa-dev@lists.apple.com) 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: https://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com This email sent to arch...@mail-archive.com