2010-07-08 35 views
15

donc je travaille sur un jeu simple iPhone et essaie de faire une table locale de score élevé. Je veux faire un tableau et y ajouter les meilleurs scores. Voici le code que j'ai jusqu'à présent:Comment faire un tableau de CGFloats dans l'objectif 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; 
    } 

Le problème est que highscore est un NSMutableArray, qui ne peut stocker des objets. Alors voici ma question, quelle est la meilleure façon de stocker CGFloats dans un tableau? Est-ce un type de tableau différent qui prend en charge CGFloats? Est-ce que c'est un moyen simple de transformer un CGFloat en objet?

Et s'il vous plaît ne pas commenter le fait que je stocke des scores dans le délégué de l'application, je sais que c'est une mauvaise idée, mais je ne suis pas d'humeur à faire un singleton maintenant que les applications presque terminé.

+1

utiliser NSNumber pour envelopper CGFloat? – yehnan

+4

Malheureusement, je ne savais pas comment utiliser NSNumbers jusqu'à ce que la bonne personne ci-dessous m'a dit. – meman32

Répondre

26

Vous ne pouvez ajouter des objets à un NSArray, donc si vous voulez vous ajoutez CGFloat s à un tableau, vous pouvez utiliser NSNumber.

Par exemple:

NSNumber * aNumber = [NSNumber numberWithFloat:aFloat]; 

Puis pour le récupérer:

CGFloat aFloat = [aNumber floatValue]; 
+0

Merci, je vais essayer ça. Edit: Il a très bien fonctionné, grâce – meman32

+6

Avec Xcode 4.5, cela peut être condensé à '@ (floatVariable)' pour obtenir votre NSNumber. Par exemple, 'NSNumber * aNumber = @ (4.65);' – WDUK

+1

Ce n'est pas sécuritaire! Il peut fonctionner maintenant que les iDevices utilisent toujours une architecture 32 bits, mais une fois qu'ils passeront à 64 bits dans quelques années, cela va casser. Le seul moyen sûr est d'utiliser des objets CFNumber avec kCFNumberCGFloatType. – JanX2

12

CGFloat-à-dire des tableaux primitifs peuvent être construits comme si ...

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

et par la suite " utilisé "d'une manière similaire à ...

CGContextSetFillColor(context, colors); 

OU (de manière plus concise, par coulée) ...

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

C tableaux brut me sur ... mais cela peut être fait avec "© standard"!

+3

Facile maintenant. L'autre réponse n'est pas "fausse", plus que c'est une autre façon de le faire (particulièrement pratique si vous utilisez des objets partout). Votre méthode sera plus efficace, mais pourrait ne pas être aussi flexible que l'application dans son ensemble. Ce – WDUK

+0

est le chemin qui fait allusion à des fonctions à base C comme « CGColorCreate() », donc merci de me rappeler à ce sujet. – Kirbinator