为什么没有命名方法/构造函数的第一个参数?



取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];

在上面的调用中,您不必指定参数的名称。

最新更新