代码之家  ›  专栏  ›  技术社区  ›  griotspeak

对象C中接受原语的变量函数

  •  2
  • griotspeak  · 技术社区  · 15 年前

    现在,我有这个:

    // .h
    - (NSArray *)createNumberArrayWithInts:(NSInteger)firstArg, ...
        NS_REQUIRES_NIL_TERMINATION;
    
    // .m
    - (NSArray *)newNumberArrayWithInts:(NSInteger)firstArg, ... {
        NSMutableArray *lCreatedArray = [NSMutableArray alloc];
    
        va_list args;
        va_start(args, firstArg);
        for (NSInteger arg = firstArg; arg != nil; arg = va_arg(args, NSInteger)) {
            NSNumber *lTempNumberObject = [[NSNumber alloc] initWithInteger:arg];
            [lCreatedArray addObject:lTempNumberObject];
            [lTempNumberObject release];
    
        }
        va_end(args);
    
        NSArray *lImmutableArray = [[NSArray alloc] initWithArray:lCreatedArray];
        [lCreatedArray release];
    
        return lImmutableArray;
    }
    

    但是与nil的比较是不正确的,因为int不是对象。使用NSNumbers会破坏我的目的,因为我试图不分配此方法之外的对象。

    怎么办?

    2 回复  |  直到 13 年前
        1
  •  4
  •   Jason Coco superfell    15 年前

    这个问题也存在于C中。如果你使用这样的整数,你就不能使用哨兵(正如你所发现的)。大多数人所做的是将第一个参数定义为大小。所以你的原型可能看起来像:

    - (NSArray *)createNumberArrayWithInts:(NSUInteger)length, ...
    

    这种设计的明显问题是编译器无法检查它。如果你在大小上出错,你可能会有麻烦,但这和你在C中遇到的问题是一样的,即使你传递了一个int数组或类似的东西。这取决于打电话的人,以确保大小是正确的。

    另一个解决方案是使用非法int作为哨兵。所以,选择像MAX_INT之类的东西。当你发现的时候,停止阅读列表。不过,同样的,你也不能让编译器发出警告。。。

        2
  •  3
  •   Alex Gray    13 年前

    好吧,对于你们这些被原语迷惑不解的人。。。这里有一个大家都知道的答案。我在这里提出一个分类 CALayer 这需要一个 可变长度 “列表” CAConstraintAttribute (s),并将其应用于层。。

    @interface CALayer (VariadicConstraints)
    - (void)addConstraintsRelSuper:(CAConstraintAttribute)first,...; 
    /* REQUIRES NSNotFound termination */
    @end
    
    @implementation CALayer (VariadicConstraints)
    - (void)addConstraintsRelSuper:(CAConstraintAttribute)first,...{ /* REQUIRES NSNotFound termination */
       va_list args;   va_start(args, first);
       for (NSUInteger arg = first;  arg != NSNotFound;
                       arg = va_arg( args, NSUInteger))
       { [self addConstraint:CAConstRelSuper(arg)]; }
       va_end(args);
    }
    @end
    

    现在,添加图层约束简化为。。。

    [layer addConstraintsRelSuper:kCAConstraintMaxX, kCAConstraintHeight, NSNotFound];
    

    NSLOG层.约束 “[MaxX=superlayer.MaxX]”, “[高度=超级层.高度]”

    ……从以前的几百个字符开始。

    为了完整起见。。这是我的宏 CAConstRelSuper ...

    #define CAConstRelSuper(attr) [CAConstraint constraintWithAttribute: \
    attr relativeTo:@"superlayer" attribute:attr]