【问题标题】:getting NSMutableArray Property filled with enumerated values获取用枚举值填充的 NSMutableArray 属性
【发布时间】:2013-01-18 00:23:42
【问题描述】:

尝试通过索引从 NSMutableArray 属性中获取枚举值,该属性填充了枚举值。

我想要的只是设置一个动态属性并在类实例中重新设置。

因此, 我编写了一个暴露问题的清晰示例。

问题是这样的。示例中的 WriteByType 方法永远不会获得正确的值。 它应该记录“You Get Right Arrow”,但它没有

//----------------------------------------------------------
//  CCMyClass.h
#import <Foundation/Foundation.h>

typedef enum {
    aLeft,
    aRight
} Arrow;

@interface CCMyClass : NSObject
{
    NSMutableArray *_arrowsPkg;
}
@property(nonatomic,copy) NSMutableArray *arrowsPkg;
@property (nonatomic)int nextPkgIndex;
-(void)GetItemOne;
@end
//-------------------------------------------------------------
//  CCMyClass.m
#import "CCMyClass.h"

@implementation CCMyClass
@synthesize arrowsPkg=_arrowsPkg;

-(void)WriteByType:(Arrow)AArrow
{
switch (AArrow) {
    case aLeft:
        NSLog(@"You Get Left Arrow");
        break;
    case aRight:
        NSLog(@"You Get Right Arrow");
        break;
    }
}

-(void)GetItemOne
{
    Arrow a =(Arrow)[[self arrowsPkg]objectAtIndex:1];
    [self WriteByType:a];

}
@end
//---------------USAGE EXAMPLE----------------------------------------------
//  CCAppDelegate.m
- (IBAction)btn1Clicked:(id)sender {

    CCMyClass *c1=[[CCMyClass alloc]init];
    NSNumber *v1=[NSNumber numberWithInt:aLeft];
    NSNumber *v2=[NSNumber numberWithInt:aRight];

    NSMutableArray *arr1=[NSMutableArray arrayWithObjects:v1,v2, nil];
    [c1 setArrowsPkg:arr1];
    [c1 GetItemOne];
}

【问题讨论】:

    标签: ios properties nsmutablearray enumerated-types


    【解决方案1】:

    替换

    Arrow a = (Arrow)[[self arrowsPkg] objectAtIndex:1];
    

    Arrow a = (Arrow)[[[self arrowsPkg] objectAtIndex:1] intValue];
    

    或者,写得更清楚

    NSNumber *arrowNumber = [[self arrowsPkg] objectAtIndex:1];
    Arrow a = [arrowNumber intValue];
    

    您将Arrow 枚举类型存储在btn1Clicked: 中的NSNumber 中,因此您需要将GetItemOne 中的这些值从NSNumber * 类型拆箱为早期的int 值。

    【讨论】:

    • 谢谢!可能是我需要更改问题。如何存储枚举值? ie.like this: NSMutableArray *arr1=[NSMutableArray arrayWithObjects:aLeft,aLeft,aLeft,aRight,aLeft,aRight, nil];有人说:“正确的做法是不要让可变数组成为属性”你怎么看这个标题?link
    • 如果您使用的是最新版本的 Xcode(和 LLVM),您应该能够使用新的 Objective-C NSNumber 装箱语法,可以这样使用:[NSMutableArray arrayWithObjects:@(aLeft),@(aRight),nil];跨度>
    • 不知道。谢谢@mopsled。
    • 最后,我没有使用这种风格。 WriteByType 方法的 AArrow 参数值总是得到奇怪的值。我不会使用 NSMutableArray 作为属性,尤其是枚举值 :) 我现在更喜欢 ivar 和一些手动的 getset 方法。
    • 这里是一个可靠的解决方案报告这里。这可能会挽救某人的一天。 -(void)GetItemOne { 箭头 a =[[[self arrowsPkg]objectAtIndex:1] intValue]; [自我 WriteByType:a]; } intValue 是关键字。谢谢。
    【解决方案2】:

    [[self arrowsPkg]objectAtIndex:1]NSNumber,而不是 Arrow 枚举的成员。就像在 NSNumber 对象的初始化过程中一样,您应该通过调用 intValue 在对象及其封闭值之间进行转换。

    (真的,重新阅读 C 和 Objective-C 教程。这微不足道。

    【讨论】:

    • 感谢您的快速响应。想通过索引获取实例对象数组属性中的值。即0 表示实例对象的ArrowsPkg[0]。所以它是一个Left。它应该记录“You Get Right Arrow”但它没有。
    • @N.Ramos 是什么阻止你这样做?
    • 想要通过索引获取实例对象的数组属性中的值。即0 表示实例对象的ArrowsPkg[0]。所以它是一个Left。它应该记录“你得到左箭头”但它没有。
    • @N.Ramos 在尝试了我的建议后,它会的。
    • 那么,如何用枚举值而不是纯整数值填充?您是否介意向我推荐一个来源或书籍,其中包含解释“如何用枚举值而不是纯整数或 NSIntegers 填充 NSMutableArray”的页面?我所知道的是分配的枚举值实际上只是整数。
    猜你喜欢
    • 2010-12-20
    • 2020-12-31
    • 2011-02-16
    • 1970-01-01
    • 1970-01-01
    • 2021-05-31
    相关资源
    最近更新 更多