取NSTimer。构造时,除第一个参数(即方法名称)外,所有参数都命名为:
NSTimer *timer =
[NSTimer
scheduledTimerWithTimeInterval: seconds
target: self
selector: @selector(timerTick:)
userInfo: nil
repeats: repeats
];
为什么第一个参数没有命名?即
NSTimer *timer =
[NSTimer scheduledTimerWithTimeInterval
interval: seconds
target: self
selector: @selector(timerTick:)
userInfo: nil
repeats: repeats
];
这背后是否有一些语言设计决策?它是否提供了一些我在这里看不到的灵活性?
我认为,正确命名的Objective-C方法实际上会命名第一个参数。在您给出的示例中,第一个参数的名称为TimeInterval
,而基本方法名称为scheduledTimerWith
。
请记住,该方法实际上可以定义为:
+ (NSTimer *)scheduledTimer:(NSTimeInterval)seconds
:(id)target
:(SEL)aSelector
:(id)userInfo
:(BOOL)repeats
从而将该方法命名为CCD_ 3。
当然,这是蹩脚的,不可读的,所以每个参数都有一个名称,我们最终得到scheduledTimerWithTimeInterval:target:selector:userInfo:repeats:
,其中第一个参数命名为TimeInterval
。
实际上更准确的说法是,就像Apple文档所做的那样,"Objective-C方法声明将参数作为其名称的一部分。"
整个过程确定了方法。这就是为什么你问的方法从开始
scheduledTimerWithTimeInterval
使得它在没有用于第一参数的附加名称的情况下自然地读取。
来源:
- https://developer.apple.com/library/mac/documentation/cocoa/conceptual/ProgrammingWithObjectiveC/DefiningClasses/DefiningClasses.html#//apple_ref/doc/uid/TP40011210-CH3-SW1
作为一种存在主义的答案,为什么问题的答案通常很简单,"因为它就是这样设计的。"必须假设,Objective-C的创建者认为,这是一种比其他方法更可读的声明方法。差不多就是这样。
这是一个非常有趣的问题。除了Objective-C背后的惯例之外,我认为没有太多答案。此外,对于只有一个参数的方法,调用时间会更短。例如:
[[MyObject alloc] init];
在上面的调用中,您不必指定参数的名称。