2013-03-18 18 views
7

Sto provando a dare un valore di chiave NSDictionary a CGSize e XCode mi sta dando questo errore. Il mio codice:Elemento raccolta di tipo "CGSize" non è un oggetto Objective-C

 NSArray *rows = @[ 
     @{@"size" : (CGSize){self.view.bounds.size.width, 100} 
      } 
     ]; 

Perché sto ricevendo un errore qui? Se è impossibile memorizzare un CGSize in un ditt, qual è un approccio alternativo?

EDIT: ora ottenere "Usate 'CGSize' (aka 'struct CGSize') dove è richiesto l'aritmetica, puntatore, o il tipo di vettore" errore con questo codice:

NSDictionary *row = rows[@0]; 
CGSize rowSize = [row[@"size"] CGSizeValue] ? : (CGSize){self.view.bounds.size.width, 80}; 

risposta

21

CGSize non è un oggetto. È una struttura C Se avete bisogno di memorizzare questo in una collezione obj-c il modo standard è avvolgendolo in NSValue, in questo modo:

NSArray *rows = @[ 
@{@"size" : [NSValue valueWithCGSize:(CGSize){self.view.bounds.size.width, 100}] 
    } 
]; 

Poi più tardi, quando è necessario per ottenere il CGSize indietro, basta chiamare il metodo -CGSizeValue, per esempio

CGSize size = [rows[0][@"size"] CGSizeValue]; 
+0

E 'davvero un peccato che non si può mettere una struct C arbitraria in un oggetto Objective-C utilizzando la nuova sintassi letterale. L'unica vera difficoltà che vedrei riguarda i selettori per tirarlo fuori. –

+0

Cosa dire dell'assegnazione di un blocco come valore che restituisce CGSize? Un po 'come un "Lambda" in Python – zakdances

+1

@yourfriendzak: Sembra un po' assurdo. –

0

La risposta di Kevin funziona solo su iOS; per Mac OS X (cacao) fare:

[NSValue valueWithSize:NSMakeSize(self.view.bounds.size.width, 100)];