Ios 获取用枚举值填充的NSMutableArray属性
试图通过索引从用枚举值填充的NSMutableArray属性获取枚举值 我想要的只是设置一个动态属性,并在类实例中设置回退 因此,, 我编写了一个清晰的示例,暴露了问题的严重性 问题就在于此。示例中的WriteByType方法从未获得正确的值。 它应该记录“You Get Right Arrow”,但它没有Ios 获取用枚举值填充的NSMutableArray属性,ios,properties,nsmutablearray,enumerated-types,Ios,Properties,Nsmutablearray,Enumerated Types,试图通过索引从用枚举值填充的NSMutableArray属性获取枚举值 我想要的只是设置一个动态属性,并在类实例中设置回退 因此,, 我编写了一个清晰的示例,暴露了问题的严重性 问题就在于此。示例中的WriteByType方法从未获得正确的值。 它应该记录“You Get Right Arrow”,但它没有 //---------------------------------------------------------- // CCMyClass.h #import <Founda
//----------------------------------------------------------
// 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];
}
//----------------------------------------------------------
//Cmcyclass.h
#进口
类型定义枚举{
阿列夫特,
正确的
}箭;
@接口CCMyClass:NSObject
{
NSMutableArray*_arrowsPkg;
}
@属性(非原子,复制)NSMUTABLEARRY*arrowsPkg;
@属性(非原子)int-nextPkgIndex;
-(无效)GetItemOne;
@结束
//-------------------------------------------------------------
//Cmcyclass.m
#导入“CCMyClass.h”
@实现CCMyClass
@合成arrowsPkg=_arrowsPkg;
-(void)WriteByType:(箭头)行
{
交换机(AArrow){
案例阿列夫特:
NSLog(@“你得到左箭头”);
打破
情况正确:
NSLog(@“你得到了正确的箭头”);
打破
}
}
-(void)GetItemOne
{
箭头a=(箭头)[[self arrowsPkg]objectAtIndex:1];
[自写类型:a];
}
@结束
//---------------用法示例----------------------------------------------
//CCAppDelegate.m
-(iAction)BTN1已单击:(id)发件人{
CCMyClass*c1=[[CCMyClass alloc]init];
NSNumber*v1=[NSNumber NUMBER WITHINT:aLeft];
NSNumber*v2=[NSNumber NUMBER WITHIT:aRight];
NSMUTABLEARRY*arr1=[NSMUTABLEARRY arrayWithObjects:v1、v2、nil];
[c1设置箭头SPKG:arr1];
[c1 GetItemOne];
}
[[self arrowsPkg]objectAtIndex:1]
是一个NSNumber
,而不是Arrow
枚举的成员。就像在初始化NSNumber
对象的过程中一样,您应该通过调用对象上的intValue
在对象和其封闭值之间进行转换
(事实上,请重新阅读C和Objective-C教程。这是一个微不足道的教程。)替换
Arrow a = (Arrow)[[self arrowsPkg] objectAtIndex:1];
与
或者,写得更清楚些
NSNumber *arrowNumber = [[self arrowsPkg] objectAtIndex:1];
Arrow a = [arrowNumber intValue];
您正在
btn1Clicked:
的NSNumber
中存储箭头
枚举类型,因此您需要在GetItemOne
中将这些值从NSNumber*
类型取消到早期的int
值。感谢您的快速响应。WANTO通过索引获取实例对象数组属性中的值。ie 0表示实例对象的箭头SPKG[0]。所以它是aLeft。它应该记录“You Get Right Arrow”,但它没有。@N.Ramos还有什么可以阻止你这样做?通过索引获取实例对象数组属性中的值。ie 0表示实例对象的箭头SPKG[0]。所以它是aLeft。它应该记录“You Get Left Arrow”,但它没有。@N.Ramos在尝试了我的建议后,它会的。那么,我如何用枚举值而不是纯整数值填充呢?你介意给我推荐一本资料或书,上面有一页解释“如何用枚举值而不是纯整数或nsinteger填充NSMutableArray”吗?我只知道指定的枚举值是实数。谢谢!也许我需要改变这个问题。如何存储枚举值?例如:NSMutableArray*arr1=[NSMutableArray数组,其对象为:aLeft,aLeft,aLeft,aRight,aLeft,aRight,nil];有人说:“正确的方法是不要让可变数组成为属性”。您对这个标题怎么看?如果您使用的是最新版本的Xcode(和LLVM),您应该能够使用新的Objective-C NSNumber装箱语法,可以这样使用:[NSMutableArray arrayWithObjects:@(aLeft),@(Arright),nil]我不知道。谢谢@mopsled。最后,我没能使用这种风格。WriteByType方法的AArrow参数值总是获取奇怪的值。我不会使用NSMutableArray作为属性,尤其是对于枚举值:)我现在更喜欢使用as ivar和一些手动获取它的getset方法。这可能会拯救某人的一天-(void)GetItemOne{Arrow a=[[self arrowsPkg]objectAtIndex:1]intValue];[self WriteByType:a];}intValue是关键字。谢谢。
NSNumber *arrowNumber = [[self arrowsPkg] objectAtIndex:1];
Arrow a = [arrowNumber intValue];