2009-12-31 25 views
3

我一直在閱讀,點語法是可能的,但我不斷收到錯誤,該結構不包含我引用的成員。也許它不是點語法,所以我已經包括了我在一個解決方案的希望正在做細節:Objective-C點語法或屬性值?

// 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]; 

雖然這兩種方法應該工作,我得到兩個錯誤回報。我究竟做錯了什麼?我最好的想法是,我使用錯誤的@屬性,但我想我已經嘗試了所有。我正在執行主要的alloc。理想情況下,我想爲這個使用點語法,並不明白爲什麼不允許它。

回答

0

[mobInfo objectAtIndex:0 setmName:@「doug」];

沒有objectAtIndex:setmName方法,所以你將不得不解釋你認爲這甚至應該做什麼。

mobInfo [1] .MName = @「eric」;

使用objectAtIndex在NSArray對象中查看某些東西。

+0

我想他的意思'[mobInfo objectAtIndex:0] setmName:@ 「豆豆」];'。其他答案似乎糾正了這一點。 – 2009-12-31 17:51:33

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。米

    #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! 
    
    +2

    由於單獨的「答案」不夠充分,我會加以解決: 4.當您在@interface中定義變量時,無需爲每個變量指定@public。如果您在第一個之前放置了@public,則所有後續實例變量(直到您指定@protected或@private)都將公開。 – 2009-12-31 15:23:59

    +0

    好點。我完全刪除了'@ public'關鍵字,因爲在這種情況下根本不需要它們。 – 2009-12-31 15:30:20

    +1

    關於第1點:mobInfo是MobDefs的成員,而不是MobRec,所以在MobRec中合成它沒有意義,您發佈的示例代碼也不反映這一點。 – 2009-12-31 16:08:25

    3

    您需要可以通過投返回-objectAtIndex對象:,或使用它的方法調用:

    [[mobInfo objectAtIndex: 0] setMName: @"doug"]; 
    

    ((Mobrec *) [mobInfo objectAtIndex: 0]).MName = @"doug"; 
    
    +1

    我想屬性訪問應該是.mName,而不是.MName,只要他聲明。 douglasrahn,選擇像「mMember」這樣的屬性名稱是一個非常糟糕的主意。每種語言都有自己的慣例; Obj-C不使用前導m! – Yuji 2009-12-31 15:26:06

    +0

    沒有約定,m前綴用於幾個Apple示例中 - 可能由前PowerPlant粉絲編寫。 – 2009-12-31 15:33:10

    +0

    啊,我已經看到mSomething爲變量的實例,但不是屬性:p你能給我的鏈接?提前致謝! – Yuji 2009-12-31 15:52:14