En Objective-C, vous ne pouvez pas déclarer les noms de méthode, où le dernier composant ne prend pas un argument. Par exemple, la suite est illégal.
-(void)take:(id)theMoney andRun;
-(void)take:(id)yourMedicine andDontComplain;
Pourquoi était-Objective-C conçu de cette façon? Était-ce simplement un objet de Smalltalk que personne n'a vu un besoin de se débarrasser de?
Cette limitation a de sens que dans Smalltalk, depuis Smalltalk n'a pas de délimiteurs autour de message d'invocation, de sorte que le dernier élément pourrait être interprété comme un message unaire pour le dernier argument. Par exemple, BillyAndBobby take:'$100' andRun
serait analysée comme BillyAndBobby take:('$100' andRun)
. Ce n'est pas grave en Objective-C, où les crochets sont nécessaires.
Soutien sans paramètre sélecteur de composants n'est pas gagner beaucoup de toutes les façons habituelles d'une langue est mesurée, comme le nom de la méthode à un programmeur de prélèvement (par exemple, runWith:
plutôt que d' take:andRun
) n'affecte pas la fonctionnelle de la sémantique d'un programme, ni l'expressivité de la langue. En effet, un programme sans paramètre composants est l'alpha équivalent à celui sans. Je suis donc pas intéressé par les réponses que l'état une telle fonctionnalité n'est pas nécessaire (à moins que c'était les raisons de l'Objective-C concepteurs; est-ce que quelqu'un arrive à savoir Brad Cox ou Tom Amour? Sont-ils là?) ou que dire de la façon d'écrire les noms de méthode de sorte que la fonctionnalité n'est pas nécessaire. Le principal avantage est de la lisibilité et de writability (qui est comme la lisibilité, seul... vous savez), comme cela signifierait que vous pourriez écrire les noms de méthode que même les plus proches du langage naturel phrases. Les goûts de l' -(BOOL)applicationShouldTerminateAfterLastWindowClosed:(NSApplication*)theApplication
(Matt Gallagher points sur les "Cacao Avec l'Amour" est un peu déroutant lorsque vous déposez le paramètre formel) peuvent être nommés -(BOOL)application:(NSApplication*)theApplication shouldTerminateAfterLastWindowClosed
, plaçant ainsi le paramètre immédiatement à côté du nom.
Apple Objective-C runtime (par exemple) est tout à fait capable de gérer ce genre de sélecteurs, alors pourquoi ne pas le compilateur? Pourquoi ne pas les soutenir dans les noms de méthode?
#import <Foundation/Foundation.h>
#import <objc/runtime.h>
@interface Potrzebie : NSObject
-(void)take:(id)thing;
@end
@implementation Potrzebie
+(void)initialize {
SEL take_andRun = NSSelectorFromString(@"take:andRun");
IMP take_ = class_getMethodImplementation(self, @selector(take:));
if (take_) {
if (NO == class_addMethod(self, take_andRun, take_, "@@:@")) {
NSLog(@"Couldn't add selector '%@' to class %s.",
NSStringFromSelector(take_andRun),
class_getName(self));
}
} else {
NSLog(@"Couldn't find method 'take:'.");
}
}
-(void)take:(id)thing {
NSLog(@"-take: (actually %@) %@",NSStringFromSelector(_cmd), thing);
}
@end
int main() {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
Potrzebie *axolotl=[[Potrzebie alloc] init];
[axolotl take:@"paradichloroaminobenzaldehyde"];
[axolotl performSelector:NSSelectorFromString(@"take:andRun")
withObject:@"$100"];
[axolotl release];
[pool release];
return 0;
}