【问题标题】:How do I pass multiple parameters in Objective-C?如何在 Objective-C 中传递多个参数?
【发布时间】:2010-10-17 21:12:08
【问题描述】:

我已经阅读了几篇关于 Objective-C 方法语法的文章,但我想我不明白一个方法的多个名称。

我正在尝试使用NSStringNSTimeInterval 参数以及NSMutableArray 的返回类型创建一个名为getBusStops 的方法。这就是我构建该方法的方式,但它显然在运行时会出错:

- (NSMutableArray *)getBusStops:(NSString *)busStop
                                (NSTimeInterval *)timeInterval;

我看到了另一个方法的例子:

-(NSInteger)pickerView:(UIPickerView *)pickerView
            numberOfRowsInComponent:(NSInteger)component

我不明白为什么这个方法对每个参数都有一个方法名。我应该对类似的东西做同样的事情:

- (NSMutableArray *)getBusStops:(NSString *)busStop
                        forTime:(NSTimeInterval *)timeInterval

【问题讨论】:

    标签: objective-c syntax parameters methods


    【解决方案1】:

    您至少需要用“:”分隔每个参数名称。从技术上讲,该名称是可选的,但为了便于阅读,建议使用该名称。所以你可以写:

    - (NSMutableArray*)getBusStops:(NSString*)busStop :(NSTimeInterval*)timeInterval;
    

    或者你的建议:

    - (NSMutableArray*)getBusStops:(NSString*)busStop forTime:(NSTimeInterval*)timeInterval;
    

    【讨论】:

    • +1:Objective-C 函数参数确实是位置的,没有命名,所以标签是可选的,供人类使用。
    • 不知道为什么在签名中首选“forTime”,“timeInterval”可以作为函数中的第二个参数,对吧?
    • @galactica - 当然,这个名字可以是任何对你来说最有意义的名字。此示例使用 OP 的术语来保持一致性。
    • 仍然不确定forTime 的用途是什么?
    【解决方案2】:

    Objective-C 没有命名参数,因此冒号左侧的所有内容都是方法名称的一部分。例如,

    getBusStops: forTime:
    

    是方法的名称。名称已分解,因此可以更具描述性。你可以简单地命名你的方法

    getBusStops: :
    

    但这并不能告诉你关于第二个参数的太多信息。

    【讨论】:

      【解决方案3】:

      是的;出于几个原因,Objective-C 方法语法是这样的;其中之一是为了清楚您指定的参数是什么。例如,如果您将对象添加到某个索引处的NSMutableArray,您可以使用以下方法:

      - (void)insertObject:(id)anObject atIndex:(NSUInteger)index;
      

      这个方法叫做insertObject:atIndex:,很明显,一个对象被插入到指定的索引处。

      在实践中,添加一个字符串“Hello, World!”在名为 arrayNSMutableArray 的索引 5 处将调用如下:

      NSString *obj = @"Hello, World!";
      int index = 5;
      
      [array insertObject:obj atIndex:index];
      

      这也减少了方法参数顺序之间的歧义,确保您首先传递对象参数,然后传递索引参数。这在使用带有大量参数的函数时变得更加有用,并减少了传递参数时的错误。

      此外,方法命名约定是因为Objective-C不支持重载;但是,如果您想编写一个执行相同工作但采用不同数据类型的方法,则可以做到这一点;以NSNumber 类为例; this 有几种对象创建方法,包括:

      • + (id)numberWithBool:(BOOL)value;
      • + (id)numberWithFloat:(float)value;
      • + (id)numberWithDouble:(double)value;

      在诸如 C++ 之类的语言中,您只需重载 number 方法以允许将不同的数据类型作为参数传递;但是,在 Objective-C 中,这种语法允许通过更改函数的每个变体的方法名称来实现同一函数的多个不同变体。

      【讨论】:

      • 如果函数名包含参数名,是方法调用(消息发送)时需要的参数名吗?
      【解决方案4】:

      每个参数之前的文本是方法名称的部分。从您的示例中,该方法的名称实际上是

      -getBusStops:forTime:
      

      每个 : 代表一个参数。在方法调用中,方法名称在 :s 处拆分,参数出现在 :s 之后。例如

      [getBusStops: arg1 forTime: arg2]
      

      【讨论】:

      • 我想你忘了添加方法的名称。
      【解决方案5】:

      创建方法:

      -(void)mymethods:(NSString *)aCont withsecond:(NSString *)a-second {
      //method definition...
      }
      

      调用方法:

      [mymethods:self.contoCorrente withsecond:self.asecond];
      

      【讨论】:

        【解决方案6】:
        (int) add: (int) numberOne plus: (int) numberTwo ;
        (returnType) functionPrimaryName : (returnTypeOfArgumentOne) argumentName functionSecondaryNa
        

        我:

        (returnTypeOfSecontArgument) secondArgumentName ;
        

        与其他语言一样,我们使用以下语法 无效add(int one, int second) 但在OBJ_c 中分配参数的方式与上述不同

        【讨论】:

          猜你喜欢
          • 2012-08-13
          • 2016-06-03
          • 2011-09-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-03-28
          • 1970-01-01
          • 2016-02-15
          相关资源
          最近更新 更多