代码之家  ›  专栏  ›  技术社区  ›  Andrew Johnson

如何将一个以零结尾的字符串列表传递给Objective-C函数?

  •  3
  • Andrew Johnson  · 技术社区  · 15 年前

    函数[nsarray arraywithobjects:foo、bar、nil]将以nil结尾的字符串列表传递给函数。

    如果我想编写一个类似的函数,那么声明是什么样子的,以及如何迭代字符串?

    3 回复  |  直到 15 年前
        1
  •  9
  •   Jakob Borg    15 年前

    我引用 http://developer.apple.com/mac/library/qa/qa2005/qa1405.html 它包含了全部的真相。

    下面是一个objective-c类的例子,其中包含一个在 nsmutableArray实例的参数列表中以nil结尾的所有对象:

    #import <Cocoa/Cocoa.h>
    
    @interface NSMutableArray (variadicMethodExample)
    
    - (void) appendObjects:(id) firstObject, ...;  // This method takes a nil-terminated list of objects.
    
    @end
    
    @implementation NSMutableArray (variadicMethodExample)
    
    - (void) appendObjects:(id) firstObject, ...
    {
    id eachObject;
    va_list argumentList;
    if (firstObject)                      // The first argument isn't part of the varargs list,
      {                                   // so we'll handle it separately.
      [self addObject: firstObject];
      va_start(argumentList, firstObject);          // Start scanning for arguments after firstObject.
      while (eachObject = va_arg(argumentList, id)) // As many times as we can get an argument of type "id"
        [self addObject: eachObject];               // that isn't nil, add it to self's contents.
      va_end(argumentList);
      }
    }
    
    @end
    
        2
  •  0
  •   mr-sk    15 年前

    我不确定obj-c是否对此有自己的特殊支持,但在c中,您有:

    function nArgs(int n, ...)
    

    要支持多个参数和以下实现样式:

     {
            va_list ap;
            va_start(ap, n);
    
            while (n-- > 0) {
                int i = va_arg(ap, int);
            }
    
            va_end(ap); 
        }
    

    以下是详细信息: http://www.cprogramming.com/tutorial/lesson17.html

        3
  •  0
  •   Jasarien    15 年前

    NSarray声明了这样的方法:

    + (id)arrayWithObjects:(id)firstObj, ... NS_REQUIRES_NIL_TERMINATION;
    

    当您实现它时,您需要使用va_-arg宏来获取每个参数。

    仰望 va_list , va_start() , va_arg() 等等。

    有关更多信息,请参见 va_arg 看看stdarg.h