2013-03-07 10 views
6

Sto cercando di utilizzare una struttura per memorizzare tre valori come un'unità per così dire. Ricevo un errore: "Expression not assignable" quando provo ad assegnare valori ai valori della struct dalla vista super dell'oggetto.iOS, Usa struct in Objective C, valori di struct non assegnabili da super view

Qualcuno sa perché questo è?

nel file h della mia classe ho definito la struct e una proprietà

@interface MyClass : UIView 

{ 
    struct customStruct { 
     float a; 
     float b; 
     float c; 
    }; 

} 

@property (assign, nonatomic) struct customStruct myStruct; 

dalla vista super cerco di assegnare un valore e ottengo un errore: "Expression not assignable"

object.myStruct.a = someValue; 

risposta

18

Try questo:

struct customStruct aStruct = object.myStruct; 
aStruct.a = someValue; 
object.myStruct = aStruct 

E 'esattamente la stessa situazione di non essere in grado di fare questo:

view.frame.size.width = aWidthValue; 

BTW dichiarare una struttura all'interno di un'interfaccia di classe sembra uno stile molto negativo. Questo è molto più pulito:

typedef struct { 
    float a; 
    float b; 
    float c; 
} customStruct; 

@interface MyClass : UIView 

@property (assign, nonatomic) customStruct myStruct; 
+2

Questo non è completamente corretto in quanto si desidera aggiornare il suo membro della struttura e non impostarlo da zero – giorashc

+0

Grazie! Quando dici "Prova questo" sono quelle tre linee nella superView. Scusa ma potresti chiarire un po '? – Mrwolfy

6

Questo perché object.myStruct restituisce una copia del membro della struttura e non è necessario modificare il membro a di tale copia.

Si dovrebbe fare ottenere l'intera struct cambiare il membro e quindi impostare di nuovo il membro struct (utilizzando il get/set metodi di sintesi)

2

definirlo fuori/prima interface portata:

struct LevelPath{ 
    int theme; 
    int level; 
}; 

//here goes your interface line 
@interface BNGameViewController : UIViewController{ 
} 
//create propertee here 
@property (nonatomic, assign) struct LevelPath levelPath; 
1

Per aggiungere ai suggerimenti precedenti, suggerirei di non memorizzare la struttura come una proprietà, ma una variabile membro. Ad esempio:

@interface MyClass() { 

    CGPoint myPoint; 

} 

Poi nella tua classe è possibile assegnare nuovi valori a quella struct direttamente:

myPoint.x = 100.0; 

invece di quando si tratta di un @property, che è di sola lettura:

myPoint = CGPointMake(100.0, myPoint.y); 

Dato che non si tratta di una sottoclasse NSObject, a meno che non si stia sovrascrivendo i metodi getter/setter, non vedo più lo scopo di renderlo un @property, poiché è utile soprattutto per ARC con la gestione della memoria dei tuoi oggetti. Ma per favore correggimi se sbaglio su questo punto (ahi).