-2

次のようなオブジェクトがあります。

@interface object : NSObject
{    
    NSString *_observation;    
    NSInteger _id;    
    NSString *_date;
    NSString *_device;  
    double _latitude;
    double _longitude; 
}

ご覧のとおり、いくつかの属性があります。次にNSMutableArray、上記のようなオブジェクトでいっぱいの を作成します。

array[object, object ,object, ....]

私が聞きたいのは、特定のオブジェクトの特定の属性を配列に処理するにはどうすればよいですか? たとえば、最初のオブジェクト ID 属性を obj-c の配列に処理するにはどうすればよいですか?

どうもありがとうございました!

4

4 に答える 4

3

私が質問を正しく理解していれば、オブジェクトのインスタンス変数にアクセスしたいと思うでしょうNSMutableArray

質問がそれほど簡単な場合、これが解決策です。

NSInteger *currID = [array objectAtIndex:x].id;

さらに、高速列挙を使用して、各要素の変数にアクセスする配列全体を調べることができます。

NSInteger *currID;
for (NSObject *currentObject in array) {
    currID = currentObject.id;
    //proccess ID
}

これは、.h ファイルで次のように設定していることを前提としてい@propertyます。id

@property (nonatomic) BOOL latitude;
@property (nonatomic) BOOL longitude;
@property (nonatomic, copy) NSString *observation;    
@property (nonatomic) NSInteger id;    
@property (nonatomic, copy) NSString *date;
@property (nonatomic, copy) NSString *device;

そしてもちろん.mで:

@synthesize latitude;
@synthesize longitude;
@synthesize observation;
@synthesize id;
@synthesize date;
@synthesize device;
于 2012-07-06T15:30:24.323 に答える
0

また

[[array objectAtIndex:0] id]

また

[array objectAtIndex:0].id

_idデータメンバーの周りのプロパティが呼び出されると仮定しますid。これはプロパティの getter 呼び出しであり、ivar への直接アクセスではありません。

NSArraya[i] インデックス表記で C 配列をエミュレートしませんし、エミュレートすることもできません。これは、[] 演算子を再定義できる C++ ではありません。上記の行で、角かっこは、配列のインデックス付けではなく、ObjC メソッド呼び出し (別名「メッセージ パッシング」) を表します。

于 2012-07-06T15:47:19.187 に答える
0

NSArrayドキュメンテーションはあなたの友達です。

- (id)objectAtIndex:(NSUInteger)indexとにかく、オブジェクト配列にアクセスするには、のメソッドを使用できますNSArray

Seva Alekseyevが言っていることは、クラスは別の方法で構成する必要があるということです。例えば:

//.h
@interface MyCustomObject : NSObject
{
    // you dont need to declare variables, the compiler will do it for you
}

@property (nonatomic, copy) NSString* objObservation;
@property (nonatomic, assign) NSInteger objId;
@property (nonatomic, copy) NSString* objDate;
@property (nonatomic, copy) NSString* objDevice;
@property (nonatomic, assign) double objLatitude;
@property (nonatomic, assign) double objLongitude;

@end

//.m
@implementation MyCustomObject

@synthesize objId;
@synthesize objDate;
@synthesize objDevice;
@synthesize objLatitude;
@synthesize objLongitude;
@synthesize objObservation;

- (void)dealloc
{
    /* uncomment if you don't use ARC
    [objDate release];
    [objDevice release];
    [objObservation release];

    [super dealloc];
     */
}

@end

このようにクラスを使用します(する必要があります#import "MyCustomObject.h"

// populate your object
MyCustomObject* myObj = [[MyCustomObject alloc] init];
myObj.objDate = @"yourDate";
myObj.objDevice = @"yourDevice";
myObj.objId = 1;
myObj.objLatitude = 22.0;
myObj.objLongitude = 23.87;
myObj.objObservation = @"yourObservation";

// insert it into your array (here only for test purposes but you could create an instance variable for store it)
NSArray* myArray = [NSArray arrayWithObjects:myObj, nil];

// if you don't use ARC
[myObj release];

// grab the object from the array
MyCustomObject * currentObj = [myArray objectAtIndex:0];
// see its values, for example
NSLog(@"%@", [currentObj objDevice]);

ここで、いくつかのメモを追加します。

  • クラスを使用する場合、大文字で呼び出します。たとえばMyClass、notmyclassの場合、変数は代わりに小文字で始まります。myVariable
  • 配列が異なる時間に設定される可能性がある場合は、NSMutableArray. ANSArrayは一度作成すると変更できません。NSMutableArray動的ではなく、オブジェクトを追加または削除できます
  • オブジェクトを扱うときは、変数をプロパティでラップする必要があります (この場合、コンパイラがオブジェクトに@synthesizeディレクティブを提供するため、変数は必要ありません)。これにより、オブジェクトのカプセル化を壊さないようにすることができます
  • 必要に応じて、オブジェクトに初期化子を提供することを考えることができます

質問を書くときは、その周りに何らかの文脈を置き、何をしたか、何を達成したいかを説明するようにしてください。

于 2012-07-06T15:49:53.153 に答える
0

配列内のオブジェクトのメンバーにアクセスするには、そのオブジェクトへのポインターを取得する必要があります。すなわち:

object *firstObject = [array objectAtIndex:0];
firstObject.id = 0;
object *secondObject = [array objectAtIndex:1;
...
于 2012-07-06T15:29:42.803 に答える