2016-04-15 9 views
0

Ich habe diese NSUInteger erstellen:Wie öffentliche 2d-Array-Eigenschaft

@implementation BoardModel 
    { 
     NSUInteger _board[5][5]; 
    } 

Ich bin in der Lage zu setzen und erhalten ihre Informationen in meiner BoardModel.m Datei, aber ich brauche diese Informationen in meinem GameViewController zuzugreifen. m Datei. Hier ist, was ich versucht:

@property (nonatomic) NSUInteger board[5][5]; 

erhielt ich die Fehlermeldung: 'Eigenschaft nicht Array oder Funktionstyp NSUInteger * haben kann [5] [5].'

Also, ich muss definitiv auf diese Informationen aus der BoardModel.m Datei zugreifen, und ich möchte es tun, ohne eine Setter-Funktion in meiner GameViewController.m-Datei.

+0

Wie der Fehler angibt, können Sie keine Objective-C-Eigenschaft mit C-Array-Typen erstellen. Sie haben keine andere Wahl, als Setter/Getter-Methoden zu schreiben, die in Zeilen-/Spaltenindizes usw. übergeben werden. – rmaddy

Antwort

0

Sie versuchen, C-Arrays mit Objective-C-Klassen zu mischen, dies funktioniert bis zu einem gewissen Grad, was nicht beinhaltet, sie als Eigenschaften verwenden zu können. Sie haben mehrere verschiedene Lösungen für das Problem, einige von ihnen sind:

  • Verwendung NSArray zusammen mit NSNumber und alles tun, Objective-C-Stil
  • wickeln Sie das Array in einem struct, so dass Sie dann auf das Feld zugreifen korrekt durch die struct.

Etwas wie:

typedef struct 
{ 
    NSUInteger data[5][5]; 
} board; 

@interface MyClass : NSObject 
{ 
    board _board; 
} 

@property(readonly,nonatomic) board* board; 

@end 

@implementation MyClass 

-(board*) board 
{ 
    return &_board; 
} 

@end 

dann durch die struct passieren Sie benötigen, um auf Daten zuzugreifen, zum Beispiel: object.board->data[i][j].

+0

Gibt es eine Möglichkeit, diese Daten einem Objekt zuzuweisen? Wie, alloc-init 'Objekt' in GameViewController.m dann eine permanente Brücke zu diesen Daten zu bauen? –

+0

Eigentlich bin ich in der Lage, dann die Eigenschaft zu verwenden, um auf die Informationen in meinem GameViewController.m zuzugreifen. –

0

Eine Eigenschaft in Objective-C kann keinen C-Array-Typ haben, da C-Arrays nicht als Wert übergeben werden können, z. Sie können keine C-Funktion schreiben, die ein Array als Parameter verwendet, oder ein Array einem anderen zuweisen.

Sie können einen C-Array auf eine Funktion von Adresse (oder Zeigern) passieren, das heißt der übergebene Wert ist die Adresse eines Arrays und die Funktion des Original-Array über diesen Zeiger zugreifen kann. Es muss darauf geachtet werden, dass das Array, dessen Adresse übergeben wird, mindestens so lange lebt, wie die Adresse verwendet werden kann. In C gibt es einen Standardtrick, wenn Sie ein Array nach Wert übergeben müssen: In C-Struktur sind Werttypen und Strukturen können Felder vom Array-Typ haben. Um ein Array als Wert zu übergeben, erstellen Sie einfach ein einzelnes Feld Struktur ...

Aber von Ihren Kommentaren wünschen Sie, dass Ihre Eigenschaft direkten Zugriff auf das Lesen und Ändern der ursprünglichen Array haben, so dass die Weitergabe der Adresse ist, was Sie brauchen.

Um die Dinge einfacher, definieren einige Typen zusammen mit der Eigenschaft:

@interface BoardModel : NSObject 

typedef NSUInteger Board[5][5]; // Give the array a name 
typedef Board *BoardPtr;  // A pointer to a Board 

@property (readonly) BoardPtr board; // Property return a pointer 

@end 

Die Definition des Arrays und Eigentum sind einfach:

@implementation BoardModel 
{ 
    Board _board; 
} 

- (BoardRef) board { return &_board; } 

Jetzt an anderer Stelle von Ihnen eine BoardModel erstellen und Erhalte einen Zeiger auf sein Array:

BoardModel *boardModel = [BoardModel new]; 
BoardPtr theBoard = boardModel.board; 

und dann zugreifen Elemente des Arrays müssen indirekt durch theBoard und Index, z.

... (*theBoard)[i][j] ... 

Ein solcher Ausdruck direkt (und effizient) Zugriff auf das Array.

Wichtig: Der Wert in theBoard gespeichert ist nur gültig, solange BoardModel Objekt referenziert von boardModel existiert - es ist ein direkter Zeiger in das Objekt. Als ein Zeiger auf das Innere eines Objekts funktioniert nicht arbeiten, um das Objekt am Leben zu halten.

HTH

Verwandte Themen