【问题标题】:Objective c implement method which takes array of arguments接受参数数组的目标c实现方法
【发布时间】:2011-07-12 18:18:12
【问题描述】:

嘻嘻

有谁知道如何在目标 c 中实现一个方法,该方法将参数数组作为参数,例如:

[NSArray arrayWithObjects:@"A",@"B",nil];

这个方法的方法声明是:

+ (id)arrayWithObjects:(id)firstObj...

我自己似乎无法做出这样的方法。我做了以下事情:

+ (void) doSometing:(id)string manyTimes:(NSInteger)numberOfTimes;

[SomeClass doSometing:@"A",@"B",nil manyTimes:2];

它会给函数 'doSometing:manyTimes:' 提供​​太多参数的警告

已经谢谢了。

【问题讨论】:

    标签: objective-c arrays methods


    【解决方案1】:

    我认为您在使用可变参数函数。这是 Apple 的文档:http://developer.apple.com/library/mac/qa/qa2005/qa1405.html

    【讨论】:

      【解决方案2】:

      多个参数(也称为 arglist)只能出现在方法声明的末尾。您的 doSomething 方法看起来像这样:

      + (void)doNumberOfTimes:(NSInteger)numberOfTimes withStrings:(id)firstArg, ...
      {
          va_list args;
          va_start(args, firstArg);
      
          NSString * argString = firstArg;
          while (argString != nil)
          {
              // do something with argString here
      
              argString = va_arg(args, NSString *);
          }
      
          va_end(args);
      }
      

      如下调用:

      [SomeClass doNumberOfTimes:2 withStrings:@"A", @"B", nil];
      

      另请参阅:How to create variable argument methods in Objective-C

      【讨论】:

        【解决方案3】:

        省略号 (...) 继承自 C;您只能将它用作调用中的最后一个参数(并且您在示例中错过了相关的逗号)。所以在你的情况下,你可能想要:

        + (void)doSomethingToObjects:(id)firstObject, ...;
        

        或者,如果您希望计数是明确的并且可以想出一种很好的措辞方式:

        + (void)doManyTimes:(NSInteger)numberOfTimes somethingToObjects:(id)firstObject, ...;
        

        然后您可以使用普通的 C 方法来处理位于 stdarg.h 中的省略号。有一个关于here 的快速文档,示例用法如下:

        + (void)doSomethingToObjects:(id)firstObject, ...
        {
            id object;
            va_list argumentList;
        
            va_start(argumentList, firstObject);
            object = firstObject;
        
            while(1)
            {
                if(!object) break; // we're using 'nil' as a list terminator
        
                [self doSomethingToObject:object];
                object = va_arg(argumentList, id);
            }
        
            va_end(argumentList);
        }
        

        编辑:添加,以响应 cmets。由于C处理函数调用的方式(由Objective-C继承,尽管不是很明显),您不能将省略号中交给您的各种东西传递给另一个采用省略号的函数。相反,您倾向于传递 va_list。例如

        + (NSString *)doThis:(SEL)selector makeStringOfThat:(NSString *)format, ...
        {
            // do this
            [self performSelector:selector];
        
            // make string of that...
        
            // get the argument list
            va_list argumentList;
            va_start(argumentList, format);
        
            // pass it verbatim to a suitable method provided by NSString
            NSString *string = [[NSString alloc] initWithFormat:format arguments:argumentList];
        
            // clean up
            va_end(argumentList);
        
            // and return, as per the synthetic example
            return [string autorelease];
        }
        

        【讨论】:

        • 还有没有办法将省略号作为参数,然后传递给另一个方法?
        • @Mats:您通常会获取 va_list 并将其传递(因此,例如 vprintf 或 NSString -initWithFormat:arguments:)。您不能只传递省略号所描述的任何内容(例如,让省略号函数调用另一个函数),因为 C 运行时不需要知道那里有多少内容,因此无法复制它。
        • 你能给出一个将省略号传递给第二个objective-c方法的代码示例吗?
        • 你实际上不能通过省略号。你必须通过 va_list。添加了示例。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-17
        • 2013-08-09
        相关资源
        最近更新 更多