8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

Objective C 中接受原语的可变参数函数

steliosbl 1月前

52 0

现在,我有这个:// .h- (NSArray *)createNumberArrayWithInts:(NSInteger)firstArg, ... NS_REQUIRES_NIL_TERMINATION;// .m- (NSArray *)newNumberArrayWithInts:(NSInteger)firstArg, ... {...

现在,我有这个:

// .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 对我来说没有意义,因为我试图不在此方法之外分配对象。

该怎么办?

帖子版权声明 1、本帖标题:Objective C 中接受原语的可变参数函数
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由steliosbl在本站《objective-c》版块原创发布, 转载请注明出处!
最新回复 (0)
  • C 中也存在此问题。如果您使用这样的整数,则不能使用标记(正如您所发现的)。大多数人所做的是将第一个参数定义为大小。因此您的原型可能看起来像:

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

    这种设计的一个明显问题是编译器无法检查它。如果你在大小上犯了错误,你可能会遇到麻烦,但即使你传递了一个 int 数组或类似的东西,你在 C 中也会遇到同样的问题。调用者有责任确保大小正确。

    另一个解决方案是使用非法 int 作为标记。因此,选择 MAX_INT 之类的东西。当您发现它时,请停止阅读列表。但是,您无法真正让编译器对此发出警告...

  • 我认为,如果整数类型是 NSInteger,那么最好的哨兵值可能是 NSNotFound,它应该是可以表示为 NSInteger 的最大可能值。

  • @JeremyP:实际上,由于他使用的是 NSInteger,因此他可能应该使用 NSIntegerMax。NSNotFound 实际上定义为 NSIntegerMax,但在我看来,使用 NSIntegerMax 更合适。不过,老实说,我认为将整数数量添加为第一个必需参数是解决此问题的最佳方法。

  • 在过去的 2 个小时里,我一直在犹豫哪个方法最好。我现在正在使用 NSNotFound 方法,但为什么你希望将长度作为第一个必需参数?(我选择 NSNotFound 只是为了便于阅读)

  • @griotspeak:长度是 C 语言中实现的方式,而且它不会从池中删除潜在的整数。您可能还想创建自己的更具可读性的 sentinel 常量,并将其定义为 NSIntegerMax,而不是重载 NSNotFound,因为 NSNotFound 作为 sentinel 名称确实没有意义。

  • 好吧,对于那些对 VA_ARGS 之类的原语感到困惑的人来说……这里有一个适合所有人的简单答案。在这里,我提出了一个类别, CALayer 它采用 可变长度的 “列表” CAConstraintAttribute ,并将它们应用于层。

    @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 layer.constraints\'[MaxX = superlayer.MaxX]\',\'[Height = superlayer.Height]\'

    ...之前可能会有数百个字符。

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

    #define CAConstRelSuper(attr) [CAConstraint constraintWithAttribute: \
    attr relativeTo:@"superlayer" attribute:attr]
    
返回
作者最近主题: