【问题标题】:Don't understand multiple parameter declarations in objective-c不理解objective-c中的多个参数声明
【发布时间】:2010-06-11 21:43:55
【问题描述】:

有人可以帮我澄清一下吗:

当有多个参数时,参数在冒号后面的方法名称中声明。 参数在声明中将名称分开,就像在消息中一样。例如:

- (void)setWidth:(float)width height:(float)height;

所以在上面:

  1. 方法是实例变量
  2. 返回无效
  3. parameter#1 是一个浮点数,名为 width。
  4. 参数#2 是一个浮点数,命名为高度。

但为什么是 hieght:(float)height;而不仅仅是:

- (void)setWidth: (float)width (float)height;

【问题讨论】:

    标签: objective-c


    【解决方案1】:

    Objective-C 没有命名参数。它也没有“关键字参数”。

    Objective-C 使用所谓的“交错参数”。也就是说,方法的名称与参数交错,以便生成更具描述性和可读性的代码。

    [myObject setWidth:w height:h];
    

    上面的内容实际上是 告诉 myObject 将宽度设置为 w 并将高度设置为 h

    在上面的例子中,方法的名字——它的selector——正好是setWidth:height:。不多也不少。

    这在Objective-C guide中都有解释。

    【讨论】:

    • “以便生成更具描述性和可读性的代码”。事实证明,他们取得了完全相反的结果。
    【解决方案2】:

    这只是 Objective-C 的一个功能,可以让您在阅读方法调用时更轻松,如下所示:

    [myObject setWidth:w height:h];
    

    您可以省略标签(第一个除外),所以如果您真的想要,您可以:

    -(void)setWidth:(float)width :(float)height
    {
      ...
    }
    

    并将其用作:

    [myObject setWidth:w :h];
    

    但这并不真正符合 Objective-C 语言的精神。这些标签的全部意义在于使这些调用更易于理解,而无需查找方法定义。

    【讨论】:

    • Objective-C not 有“标记”参数。您不能只省略方法名称的一部分。也就是说,在上面的示例中,方法 'setWidth::' 是与 'setWidth:height:' 不同的方法(这常常使新手感到困惑)。
    • @bbum,绝对是的。我并不是要制造任何他们相同的印象。您对我如何澄清这一点有什么建议吗?
    • 除了“Objective-C 将方法名称与参数交错以提高代码中的可读性和描述性”之外,我还没有提出非常好的描述。
    【解决方案3】:

    参数名称恰好也在方法名称中这一事实让您感到困惑。想想你实际上是怎么称呼它的:

    [something setWidth:500 height:250];
    

    根据您的建议,将改为:

    [something setWidth:500 250]; // That 250 is just kind of hanging 
                                  // out there — not very readable
    

    你也可以给参数一个与它前面的方法名称部分完全不同的名称:

    - (void)setGivenName:(NSString *)first surname:(NSString *)last
    

    【讨论】:

    • 只是令人困惑,在 c# 中它会是: void SetWidth(int width, int height); object.SetWidth(500, 200);好像有点奇怪,所有参数的约定好像都不一样。
    • 实际上在 C# 中是 void SetDimensions(int width, int height); object.SetDimensions(500, 200);
    猜你喜欢
    • 2014-03-24
    • 2012-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-11
    • 1970-01-01
    • 2019-07-30
    • 2012-12-13
    相关资源
    最近更新 更多