2010-07-08 12 views
15

Quindi sto lavorando ad un semplice gioco per iPhone e sto provando a creare una tabella locale con punteggio elevato. Voglio fare un array e spingere i punteggi più alti in esso. Di seguito è riportato il codice che ho finora:Come si crea una matrice di CGFloats nell'obiettivo c?

CGFloat score; 
    score=delegate.score; 
    NSInteger currentindex=0; 
    for (CGFloat *oldscore in highscores) 
    { 
     if (score>oldscore) 
     { 
      [highscores insertObject:score atIndex:currentindex] 
      if ([highscores count]>10) 
      { 
       [highscores removeLastObject]; 

      } 

     } 
     currentindex+=1; 
    } 

Il problema è che i punteggi più alti è un NSMutableArray, che può solo gli oggetti del negozio. Quindi ecco la mia domanda, qual è il modo migliore per memorizzare CGFloats in un array? È un diverso tipo di array che supporta CGFloats? È un modo semplice per trasformare un CGFloat in un oggetto?

E per favore non commentare il fatto che sto memorizzando i punteggi nel delegato dell'app, so che è una cattiva idea, ma non sono dell'umore di dover fare un singleton ora che le app quasi fatto.

+1

utilizzare NSNumber per avvolgere CGFloat? – yehnan

+4

Purtroppo non sapevo come usare NSNumbers fino a quando non mi ha detto la simpatica persona di sotto. – meman32

risposta

26

È possibile aggiungere oggetti a un NSArray, quindi se si desidera aggiungere CGFloat a un array, è possibile utilizzare NSNumber.

Esempio:

NSNumber * aNumber = [NSNumber numberWithFloat:aFloat]; 

Poi per tornare indietro:

CGFloat aFloat = [aNumber floatValue]; 
+0

Grazie, ci provo. Modifica: Funzionava alla grande, grazie – meman32

+6

Con Xcode 4.5, questo può essere condensato a '@ (floatVariable)' per ottenere il NSNumber. Ad esempio, "NSNumber * aNumber = @ (4.65);" – WDUK

+1

Questo NON è sicuro! Potrebbe funzionare ora che gli iDevice utilizzano ancora un'architettura a 32 bit, ma una volta passati a 64-bit in un paio d'anni questo si interromperà. L'unico modo sicuro è utilizzare gli oggetti CFNumber con kCFNumberCGFloatType. – JanX2

12

CGFloatcioè array primitivi può essere costruita in questo modo ...

CGFloat colors[] = { 1, 0, 0, 1 }; 

e successivamente " usato "in modo simile a ...

CGContextSetFillColor(context, colors); 

O (più conciso, tramite fusione) ...

CGContextSetFillColor(context, (CGFloat[]){ 1, 0, 0, 1 }); 

C array lordo me fuori ... ma questo può essere fatto con "© standard"!

+3

Facile ora. L'altra risposta non è "sbagliata", più che altro è un modo per farlo (particolarmente utile se stai usando oggetti dappertutto). Il tuo metodo sarà più efficiente, ma potrebbe non essere altrettanto flessibile se applicato all'intera applicazione. – WDUK

+0

Questo è il modo in cui viene suggerito per le funzioni basate su C come "CGColorCreate()", quindi grazie per avermelo ricordato. – Kirbinator