在Objective-C中,您不能声明最后一个组件不带参数的方法名称.例如,以下是非法的.
-(void)take:(id)theMoney andRun;
-(void)take:(id)yourMedicine andDontComplain;
Run Code Online (Sandbox Code Playgroud)
为什么Objective-C是这样设计的?它只是Smalltalk的神器,没有人看到需要摆脱?
这种限制在Smalltalk中是有意义的,因为Smalltalk没有围绕消息调用的分隔符,因此最终组件将被解释为到最后一个参数的一元消息.例如,BillyAndBobby take:'$100' andRun
将被解析为BillyAndBobby take:('$100' andRun)
.这在Objective-C中无关紧要,其中需要使用方括号.
支持无参数选择器组件在测量语言的所有常用方式中都不会获得太多,因为程序员选择的方法名称(例如,runWith:
而不是take:andRun
)不影响程序的功能语义,也不影响语言的表达性.实际上,具有无参数组件的程序与没有参数的组件相当.因此,我对那些没有必要说明这样一个特征的答案不感兴趣(除非那是Objective-C设计师所说的原因;有没有人碰巧知道Brad Cox或Tom Love?他们在这里吗?)或者说如何编写方法名称,以便不需要该功能.主要的好处是可读性和可写性(这就像可读性,只有......你知道),因为这意味着你可以编写更接近自然语言句子的方法名称.这样的人-(BOOL)applicationShouldTerminateAfterLastWindowClosed:(NSApplication*)theApplication
(马特·加拉格尔指出的"可可的爱"可以被命名为当您拖动一个形式参数是有点混乱)-(BOOL)application:(NSApplication*)theApplication shouldTerminateAfterLastWindowClosed
,从而将参数紧邻适当的名词.
Apple的Objective-C运行时(例如)完全能够处理这些选择器,那么编译器为什么不呢?为什么不在方法名称中支持它们呢?
#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 …
Run Code Online (Sandbox Code Playgroud)