为什么不是名为?的方法/构造函数的第一个参数?

时间:2014-09-11 22:22:42

标签: objective-c language-design

选择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
    ];

这背后有一些语言设计决定吗?它提供了一些我在这里看不到的灵活性吗?

3 个答案:

答案 0 :(得分:5)

我认为正确命名的Objective-C方法实际上确实命名了第一个参数。在您给出的示例中,第一个参数的名称为TimeInterval,而基本方法名称为scheduledTimerWith

请记住,该方法实际上可以定义为:

+ (NSTimer *)scheduledTimer:(NSTimeInterval)seconds
                           :(id)target
                           :(SEL)aSelector
                           :(id)userInfo
                           :(BOOL)repeats

为方法命名为scheduledTimer:::::

当然,这是蹩脚且不可读的,因此每个参数都有一个名称,我们最终得到scheduledTimerWithTimeInterval:target:selector:userInfo:repeats:,其中第一个参数名为TimeInterval

答案 1 :(得分:3)

正如Apple文档所做的那样,确实更准确地说,“Objective-C方法声明包含参数作为其名称的一部分。”

整个事物识别方法。这就是为什么你问的方法开始于:

scheduledTimerWithTimeInterval

...所以它自然地读取而没有第一个参数的附加名称。

来源:

作为一种存在主义的答案,为什么问题的答案通常很简单,“因为这就是它的设计方式。” Objective-C的创建者,必须假设,认为这是一种比其他方式更容易理解方法的方法。这就是它。

答案 2 :(得分:0)

这是一个非常有趣的问题。我不认为除了Objective-C背后的惯例之外,还有很多答案。此外,对于只有一个参数的方法,调用时间会更短。例如:

[[MyObject alloc] init];

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