簡體   English   中英

Objective-C點語法或屬性值?

[英]Objective-C dot syntax or property value?

我一直在閱讀點語法是可能的,但我不斷得到結構不包含我引用的成員的錯誤。 也許它不是點語法,所以我已經包含了我正在做的細節,希望有一個解決方案:

//  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。 理想情況下,我想為此使用點語法,並且無法理解為什么它不允許它。

一些事情:( 編輯:原因點#1因錯誤而被刪除

  1. 雖然支持點語法,但NSArray的數組索引語法不支持。 因此,你的呼叫到mobInfo[1]一樣[mobInfo objectAtIndex:1]; 相反, mobInfo將被視為一個簡單的C風格數組,並且該調用幾乎可以保證導致崩潰。

  2. 您不應該像在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!

您需要強制轉換-objectAtIndex:返回的對象,或者對其使用方法調用:

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

要么

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

[mobInfo objectAtIndex:0 setmName:@“doug”];

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

mobInfo [1] .MName = @“eric”;

使用objectAtIndex在NSArray對象中查找內容。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM