7
votes

Boucle en utilisant nsrange

J'essaie d'utiliser nsrange pour contenir une plage d'années, telle que xxx

je sais nsrange est utilisé principalement Pour filtrer, mais je veux boucler sur les éléments de la gamme. Est-ce possible sans convertir le nsrange en un nsarray ?


0 commentaires

4 Réponses :


6
votes

N'oubliez pas qu'un Nsrange est une structure qui maintient deux entiers, représentant le début et la longueur de la plage. Vous pouvez facilement boucler sur tous les entiers contenus à l'aide d'une boucle pour boucle.

NSRange years = NSMakeRange(2011, 5);
NSUInteger year;
for(year = years.location; year < years.location + years.length; ++year) {
    // Use the year variable here
}


0 commentaires

8
votes

Il semble que vous attendez nsrange code> comme une plage de python gamme code> objet. Ce n'est pas; nsrange code> est simplement une structure xxx pré>

pas un objet. Une fois que vous en avez créé une, vous pouvez utiliser ses membres dans un ancien pour code> boucle: p> xxx pré>

(Travailler toujours sur l'hypothèse que vous " Réfléchir à Python.) Il y a la syntaxe dans l'Objc appelé énumération rapide pour itération sur le contenu d'un nsarray code> qui est agréablement similaire à un python pour code> boucle, mais puisque les nombres littéraux et primitifs ne peuvent pas être mis dans Un nsarray code>, vous ne pouvez pas aller directement à partir d'un nsrange code> à un tableau de cacao. p>

Une catégorie pourrait rendre cela plus facile, cependant: P >

NSArray * years = [NSArray WSSArrayWithNumbersInRange:NSMakeRange(2011, 5)];
for( NSNumber * yearNum in years ){
    NSUInteger year = [yearNum unsignedIntegerValue];
    // and so on...
}


2 commentaires

Merci, dommage, il n'y a pas de soutien pour une énumération rapide pour Nsrange. pourrait me sauver du temps et des lignes de code


@Manroe: J'apprécie votre correction de mon erreur de codage, mais le Big "Edit:" Block était inapproprié; Cela aurait pu être un commentaire, le résumé de la modification ou vient vraiment de disparaître complètement.



3
votes

Ceci est un peu une question ancienne, mais une alternative à l'utilisation d'un nsarray serait de créer un nsindexset avec la plage souhaitée (en utilisant indexwithdindexesinrange: ou INITWITHIDEXESINRANGEDRANGE: ), puis Utilisez une énumération de blocs comme dans https://stackoverflow.com/ A / 4209289/138772 . (Semblait pertinent comme je me souvenais de cela moi-même.)


0 commentaires

0
votes

Ma solution de remplacement pour cela, c'était de définir une macro juste pour faire du sténographie rapide. XXX PRE>

Pour l'appeler, vous faites: P>

NSRangeEnumerate(NSUInteger i, range) {

}


0 commentaires