如何将 typedef enum 转换为 NSNumber?

15
  1. 每个typedef enum的值是否被视为int类型?

    例如,给定以下typedef enum

    // UIView.h
    
    typedef enum {
        UIViewAnimationCurveEaseInOut,
        UIViewAnimationCurveEaseIn,
        UIViewAnimationCurveEaseOut,
        UIViewAnimationCurveLinear
    } UIViewAnimationCurve;
    

    我该如何知道在创建 NSNumber 时使用哪种方法?

    + (NSNumber *)numberWithShort:(short)value;
    + (NSNumber *)numberWithUnsignedShort:(unsigned short)value;
    + (NSNumber *)numberWithInt:(int)value;
    + (NSNumber *)numberWithUnsignedInt:(unsigned int)value;
    + (NSNumber *)numberWithLong:(long)value;
    + (NSNumber *)numberWithUnsignedLong:(unsigned long)value;
    + (NSNumber *)numberWithLongLong:(long long)value;
    + (NSNumber *)numberWithUnsignedLongLong:(unsigned long long)value;
    + (NSNumber *)numberWithInteger:(NSInteger)value NS_AVAILABLE(10_5, 2_0);
    + (NSNumber *)numberWithUnsignedInteger:(NSUInteger)value NS_AVAILABLE(10_5, 2_0);
    

    我认为+[NSNumber numberWithInt:]是正确的方法,因为Best way to implement Enums with Core Data的被接受答案使用了这个方法。例如:

    [NSNumber numberWithInt:UIViewAnimationCurveLinear]
    

    但是,如果+[NSNumber numberWithInt:]是正确的,那么为什么呢?

  2. 对于一个位运算的enum,例如:

    enum {
        UIViewAutoresizingNone                 = 0,
        UIViewAutoresizingFlexibleLeftMargin   = 1 << 0,
        UIViewAutoresizingFlexibleWidth        = 1 << 1,
        UIViewAutoresizingFlexibleRightMargin  = 1 << 2,
        UIViewAutoresizingFlexibleTopMargin    = 1 << 3,
        UIViewAutoresizingFlexibleHeight       = 1 << 4,
        UIViewAutoresizingFlexibleBottomMargin = 1 << 5
    };
    typedef NSUInteger UIViewAutoresizing;
    

    我猜测 +[NSNumber numberWithUnsignedInteger:] 是正确的方法,因为在 typedef 之后有明确的 NSUInteger。是这样吗?例如:

    [NSNumber numberWithUnsignedInteger:UIViewAutoresizingNone]
    
2个回答

25

现代语法可以使用:

@(UIViewAnimationCurveLinear)


8

[NSNumber numberWithInt:your_enum_int_variable];


你很棒!谢谢。 - Mohammad Zaid Pathan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接