我一直在阅读点语法是可能的,但我不断收到结构不包含我引用的成员的错误。也许它不是点语法,所以我已经包含了我正在做的细节,希望能找到解决方案:
// MobRec.h - used as the objects in the MobInfo array
#import <Foundation/Foundation.h>
@interface MobRec : NSObject {
@public NSString *mName;
@public int mSpeed;
}
@property (nonatomic, retain) NSString *mName;
@property (nonatomic) int mSpeed;
// MobDefs.h - array of MobRecords
@interface Mobdefs : NSObject {
@public NSMutableArray *mobInfo;
}
@property(assign) NSMutableArray *mobInfo; // is this the right property?
-(void) initMobTable;
@end
// MobDefs.m
#import "Mobdefs.h"
#import "Mobrec.h"
@implementation Mobdefs
@synthesize mobInfo;
-(void) initMobTable
{
// if I use traditional method I get may not respond
[mobInfo objectAtIndex:0 setmName: @"doug"];
// if I use dot syntax I get struct has no member named mName
mobInfo[1].MName = @"eric";
}
// main.h
MobDefs *mobdef;
// main.m
mobdef = [[Mobdefs alloc] init];
[mobdef initMobTable];
虽然这两种方法都可行,但我两者都有错误。我究竟做错了什么?我最好的想法是我使用了错误的@property,但我想我已经尝试了所有。我在main执行alloc。理想情况下,我想为此使用点语法,并且无法理解为什么它不允许它。
答案 0 :(得分:9)
以下几点:( 编辑:由于错误而删除原始点#1 )
虽然支持点语法,但NSArray
的数组索引语法不支持。因此,您对mobInfo[1]
的调用将不与[mobInfo objectAtIndex:1];
相同而是将mobInfo
视为简单的C风格数组,并且几乎可以保证会导致崩溃。
您不应像在main.h中那样在头文件中定义变量。第MobDefs *mobdef;
行属于main.m。
编辑:以下是它的外观:
<强> MobRec.h 强>
@interface MobRec : NSObject {
NSString *mName;
int mSpeed;
}
@property (nonatomic, retain) NSString *mName;
@property (nonatomic) int mSpeed;
<强> MobRec.m 强>
@implementation MobRec
@synthesize mName;
@synthesize mSpeed;
@end
<强> MobDefs.h 强>
@interface MobDefs : NSObject {
NSMutableArray *mobInfo;
}
@property(assign) NSMutableArray *mobInfo;
-(void) initMobTable;
@end
<强> MobDefs.m 强>
#import "MobDefs.h"
#import "MobRec.h"
@implementation MobDefs
@synthesize mobInfo;
-(void) initMobTable
{
// option 1:
[(MobRec*)[mobInfo objectAtIndex:0] setMName:@"doug"];
// option 2:
(MobRec*)[mobInfo objectAtIndex:0].mName = @"eric";
// option 3:
MobRec *mobRec = [mobInfo objectAtIndex:0];
mobRec.mName = @"eric";
}
<强>的main.m 强>
MobDef *mobdef = [[MobDefs alloc] init];
[mobdef initMobTable];
...
[mobdef release]; // don't forget!
答案 1 :(得分:3)
您需要强制转换-objectAtIndex:返回的对象,或者对其使用方法调用:
[[mobInfo objectAtIndex: 0] setMName: @"doug"];
或
((Mobrec *) [mobInfo objectAtIndex: 0]).MName = @"doug";
答案 2 :(得分:0)
[mobInfo objectAtIndex:0 setmName:@“doug”];
没有objectAtIndex:setmName方法,所以你必须解释你认为这甚至应该做什么。
mobInfo [1] .MName = @“eric”;
使用objectAtIndex在NSArray对象中查找内容。