Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. iOS SDK
Code

Objective-C succinctement: Types de données

by
Difficulty:IntermediateLength:LongLanguages:
This post is part of a series called Objective-C Succinctly.
Objective-C Succinctly: Hello Objective-C
Objective-C Succinctly: Properties

French (Français) translation by Jeane Jade (you can also view the original English article)

 Objective-C a deux catégories de types de données. Tout d'abord, rappelez-vous que l'Objective-C est un sur-ensemble de C, de sorte que vous avez accès à tous les types de données C natifs comme char, int, float, etc. Objective-C définit également un peu de sa propre basse-types de niveau, y compris un type Booléen.  Appelons l'ensemble de ces "types de données primitifs."

 Deuxièmement, Objective-C fournit plusieurs données de haut niveau des structures comme des chaînes de caractères, des tableaux, des dictionnaires et des dates. Ces types de données sont mis en œuvre comme Objective-C objets, de sorte que vous verrez beaucoup de la même orientée objet construit à partir du chapitre précédent. Puisque ce sont tous définis dans le cadre de la Fondation, nous allons les appeler "fondation des structures de données."

Figure 14 Our two categories of data types

Nos deux catégories de types de données

 Ce chapitre couvre les deux types de données primitifs et les plus importantes de la fondation de structures de données. D'ici à la fin de ce chapitre, vous devriez avoir une bonne compréhension de chaque structure de données que vous pourriez avoir besoin pour votre Objective-C programmes.


 L'Affichage Des Valeurs

En plus des types de données, nous allons aussi apprendre beaucoup plus sur NSLog() de chaîne de formatage dans ce chapitre. Cela va nous permettre de variables d'affichage de toutes sortes dans la console de Xcode, qui est une compétence indispensable pour le débogage des applications.

 Comme nous l'avons vu dans le chapitre précédent, NSLog() peut être appelée avec une chaîne de format. À l'intérieur de la chaîne de format, vous devez utiliser le symbole % pour désigner des valeurs d'espace réservé, et NSLog() va combler avec des valeurs transmises comme paramètres supplémentaires.  Par exemple, le %@ dans le code suivant est remplacé par le nom de la variable:

 Le %@ est utilisé comme un espace réservé pour les objets (Objective-C, les chaînes de caractères sont mises en œuvre comme des objets), mais les types de données primitifs utiliser leurs propres spécificateurs de format, qui seront traitées dans leurs chapitres respectifs.


Les Types De Données Primitifs

La première partie de ce chapitre examine les natifs de l'Objective-C types de données et discute de la façon de les afficher à l'aide de NSLog() les chaînes de format.  La taille des types de données présentées dans cette section est dépendant du système-la seule façon de vraiment savoir comment grand votre les types de données est d'utiliser le sizeof() fonction. Par exemple, vous pouvez vérifier la taille d'un char avec les éléments suivants:

 Cela devrait la sortie 1, ce qui signifie que le char prend 1 octet de mémoire. L' %luplaceholder est pour les entiers longs (discuté plus en détail plus tard), qui est le type de retour de sizeof().  Les prochaines sections examinent les tailles les plus courantes pour Objective-C types de données, mais n'oubliez pas que cela peut être différent de votre système.

Les booléens

Objective-C des programmes de l'utilisation de la BOOL type de données à stocker des valeurs Booléennes. Objective-C définit également sa propre le vrai et le faux mots-clés, qui sont OUI et NON, respectivement. Pour afficher les valeurs BOOL via NSLog(), utilisez %i dans la chaîne de format:

 The %i specifier is used to display integers, so this should output It's alive: 0.

Techniquement, BOOL est une macro pour la signature de type char (discuté dans la section suivante). Cela signifie que BOOL variables peuvent stocker beaucoup plus de valeurs que juste OUI et NON, qui sont en réalité des macros pour les 1 et 0, respectivement. Cependant, la plupart des développeurs ne seront jamais utiliser cette fonctionnalité supplémentaire, car il peut être une source de frustrant bugs dans les instructions conditionnelles:

Toute valeur supérieure à 0 true, de sorte que la première condition de l'exécution, mais la deuxième ne sera pas à cause 127 != 1. Selon la façon dont vous utilisez votre BOOL variables, cela peut ou peut ne pas être souhaitable distinction.

Chars

Objective-C utilise le même type de données char ANSI C. Il désigne un seul octet, entier signé, et peut être utilisé pour stocker des valeurs comprises entre -128 et 127 ou d'un caractère ASCII. Pour afficher un char comme un entier, il suffit d'utiliser le générique %je spécificateur introduit dans l'exemple de code précédent. Mettre en forme comme un caractère ASCII, utiliser le %de c:

Comme avec tous les types de données entier, il est possible d'allouer un unsigned char, qui permet d'enregistrer les valeurs de 0 à 255. Au lieu de l' %je prescripteur, vous devez utiliser %u comme un espace réservé pour des entiers non signés:

Entiers Courts

 Court des entiers de 2 octets entiers signés et doit être utilisé pour des valeurs comprises entre -32768 et 32767. Pour les afficher avec NSLog(), utilisez l' %hi spécificateur (le h est un "modificateur" pour le même %que j'ai utilisé dans les deux sections précédentes). Par exemple:

 Unsigned short peut être créé de la même manière que unsigned caractères et peut contenir jusqu'à 65535. Encore une fois, le u en %hu est le même que celui en %u génériques sont des entiers non signés:

"Normal" Entiers

 Le prochain sur la liste est de type int, qui est un entier de 4 octets sur la plupart des systèmes. Encore une fois, rappelez-vous que la taille de type de données dépend du système-la seule façon de savoir avec certitude comment grand vos types de données est d'utiliser le sizeof() fonction:

 Si votre type int est en effet de 4 octets, il peut contenir des valeurs entre -2147483648 et 2147483647.

 Cela signifie aussi que la version non signée pouvez enregistrer 0-4294967295.

 Entiers Longs

 Si l'int n'est pas assez grand pour répondre à vos besoins, vous pouvez vous déplacer jusqu'à la longue type de données int, qui est de 8 octets sur la plupart des systèmes modernes. C'est assez grand pour représenter les valeurs entre -9223372036854775808 et 9223372036854775807. Entiers longs peuvent être affichées via NSLog() en ajoutant la lettre l à la %i ou %u prescripteurs, comme illustré dans le code suivant:

18446744073709551615 est la valeur maximale pour la version non signée, qui, je l'espère, le plus grand entier dont vous avez besoin pour stocker.

L'idée derrière le fait d'avoir autant de types de données entier est de fournir aux développeurs la puissance à l'équilibre de leur programme de la mémoire par rapport à ses numérique de la capacité.

Flotteurs

Objective-C les programmes peuvent utiliser le type float pour représenter les 4 octets les nombres à virgule flottante. Les valeurs littérales doivent être suffixé avec f pour marquer la valeur de précision unique au lieu d'un double (discuté dans la section suivante). Utiliser le %f spécificateur de sortie de flotte avec NSLog():

 Vous pouvez également spécifier le format de sortie pour le flotteur lui-même en incluant une virgule avant la f. Par exemple, %5.3 f affichage 3 chiffres après la virgule et compléter le résultat il y a donc 5 places total (utile pour aligner le point décimal pour l'inscription de valeurs).

 Alors que les valeurs à virgule flottante ont un éventail beaucoup plus large que leur point fixe homologues, il est important de se rappeler qu'ils sont intrinsèquement pas précise. Une attention particulière doit être accordée à la comparaison des valeurs à virgule flottante, et ils ne doivent jamais être utilisées pour l'enregistrement de la précision des données sensibles (par exemple, de l'argent).  Pour la représentation en virgule fixe les valeurs en Objective-C, veuillez consulter NSDecimalNumber dans la Fondation de Données des Structures de l'article.

Double

 Le type de données double est un lit double-nombre à virgule flottante. Pour la plupart, vous pouvez le traiter comme une version plus précise de flotter.  Vous pouvez utiliser le même %f rédacteur de devis pour l'affichage en double en NSLog(), mais vous n'avez pas besoin d'ajouter f à valeurs littérales:

 Les structures

 Objective-C permet également d'accéder à la C structures, qui peuvent être utilisés pour définir des structures de données. Par exemple, si vous travaillez sur un logiciel de graphisme et d'interagir avec de nombreuses dimensions 2 points, il est commode de les encapsuler dans un type personnalisé:

 Le mot-clé typedef indique au compilateur que nous sommes la définition d'un nouveau type de données struct crée la véritable structure de données, qui comprend les variables x et y, et enfin, Point2D est le nom du nouveau type de données.   Après avoir déclaré cette structure, vous pouvez utiliser Point2D comme vous le feriez utiliser les types intégrés. Par exemple, le fragment de code suivant crée le point (10.0, 0.5) et l'affiche à l'aide de notre NSLog() les spécificateurs de format.

 Le {10.0 f, 0.5 f} la notation est appelé un composé littérale, et il peut être utilisé pour initialiser une structure. Après l'initialisation, vous pouvez également leur attribuer de nouvelles valeurs pour une structure de propriétés avec l'opérateur=:

 Les Structures sont importants pour la performance des applications gourmandes, mais ils parfois difficile à intégrer avec le haut niveau de la Fondation de structures de données. Sauf si vous travaillez avec des graphiques 3-D ou certains autres CPU-lourds de l'application, vous êtes habituellement mieux de stockage personnalisé des structures de données dans une classe à part entière au lieu d'une struct.

 Les tableaux

 Tout en Objective-C fournit sa propre orientée objet tableau des types de données, il vous offre l'accès à le faible niveau des tableaux spécifiés par la norme ANSI C. C des tableaux sont d'un bloc contigu de mémoire allouée lorsqu'elles sont déclarées, et tous leurs éléments doivent être du même type.  À la différence de C# tableaux, cela signifie que vous devez définir un tableau de longueur lorsqu'elle est déclarée, et vous ne pouvez pas affecter un autre tableau de fois qu'il a été initialisé.

 Parce qu'il n'y a aucun moyen automatique d'un programme à déterminer combien d'éléments sont dans un tableau, il n'est pas commode NSLog() spécificateur de format pour l'affichage natif de tableaux.  Au lieu de cela, nous sommes coincés avec manuellement une boucle sur chaque élément et en appelant un distinct NSLog(). Par exemple, le code suivant crée et affiche un tableau de 5 entiers:

 Comme vous pouvez le voir, C des tableaux ressemblent beaucoup atomique variables, à l'exception que vous avez à offrir leur longueur entre crochets ( [5] ). Ils peuvent être initialisés avec le même composé la syntaxe littérale structs, mais toutes les valeurs doivent être du même type.  Les éléments individuels peuvent être accessible en passant le numéro de l'élément entre crochets, ce qui est courant dans la plupart des langages de programmation. En outre, vous pouvez accéder à des éléments via des pointeurs.

 Les pointeurs de fournir un faible niveau de façon à accéder directement à des adresses mémoire dans un programme C. Et, puisque C des tableaux sont juste des blocs de mémoire contigus, les pointeurs sont un moyen naturel d'interagir avec les éléments dans un tableau.  En fait, la variable contenant un tableau natif est en fait un pointeur vers le premier élément du tableau.

 Les pointeurs sont créés en préfixant le nom de la variable avec un astérisque (*). Par exemple, nous pouvons créer une seconde référence au premier élément dans la someValues tableau avec le code suivant:

Au lieu de stocker un int valeur, *pointeur variable pointe vers l'adresse de la mémoire contenant la valeur. Ceci peut être visualisé comme suit:

Figure 15 Pointer to the first element of an array

Pointeur vers le premier élément d'un tableau

 Pour obtenir la valeur sous-jacente de l'adresse de la mémoire, nous avons besoin de déréférencer le pointeur à l'aide de l'opérateur astérisque, comme suit:

 Ceci devrait afficher 15 dans votre panneau de sortie, puisque c'est la valeur stockée dans la mémoire de l'adresse pointée par le pointeur de variable. Jusqu'à présent, c'est juste un très déroutant pour accéder à une normale (non-pointeur) variable int.  Cependant, les choses deviennent beaucoup plus intéressant lorsque vous commencez à déplacer des pointeurs avec les ++ et -- des opérateurs. Par exemple, on peut incrémenter le pointeur vers l'adresse de mémoire suivante comme suit:

 Depuis un tableau est un bloc contigu de mémoire, le pointeur va maintenant se reposer à l'adresse du deuxième élément du tableau. En conséquence, le NSLog() l'appel doit afficher 32 au lieu de 15. Ceci peut être visualisé comme suit:

Figure 16 Incrementing the pointer to the second element of an array

 Incrémenter le pointeur vers le deuxième élément d'un tableau

 Les pointeurs proposent une autre façon de parcourir un tableau. Au lieu d'accéder à des éléments via les crochets (par exemple, someValues[i]), vous pouvez, il suffit d'incrémenter le pointeur et le déréférencement d'elle pour obtenir la valeur suivante:

 Les pointeurs ont d'innombrables utilisations dans des applications de haute performance, mais en réalité, vous n'aurez probablement pas besoin d'utiliser des pointeurs avec les autochtones de tableaux, sauf si vous êtes la construction d'une forte intensité de données de l'application est très préoccupé par la vitesse.

 Cependant, les pointeurs sont encore très importants pour Objective-C, parce que chaque objet est référencé par un pointeur. C'est pourquoi toutes les structures de données dans le prochain Fondation des Structures de Données de la section sont déclarés comme des pointeurs (par exemple, NSNumber *someNumber, pas NSNumber someNumber).

Vide

Le type void représente l'absence de valeur. Au lieu de taper des variables, le vide est utilisée avec les fonctions et de méthodes qui ne retourne pas une valeur. Par exemple, la méthode sayHello du chapitre précédent n'a pas renvoyé de quoi que ce soit, et il a donc été défini avec le type de données void:

Nul et NUL

 Le nul et NUL les mots-clés sont utilisés pour représenter vide pointeurs. Ceci est utile pour indiquer explicitement qu'une variable ne contient rien, plutôt que de le laisser comme un pointeur à sa plus récente adresse mémoire.

Il est, cependant, une distinction stricte entre les deux. Le néant constante doit être utilisé uniquement comme une valeur vide pour Objective-C objets-il ne doit pas être utilisé pour un natif de style C les pointeurs (par exemple, int *somePointer). La valeur NULL peut être utilisé pour les primitives des pointeurs ou Objective-C pointeurs d'objet, mais nul est le choix préféré.


Type De Données Primitif Résumé

La première partie de ce chapitre introduit les types de données primitifs disponible à l'Objective-C programmeurs. Nous avons également pris un bref regard sur les pointeurs et le néant, et NULLE mots-clés.

 Il est important de se rappeler que la valeur stockée dans une variable est complètement indépendante de la façon dont il est interprété.  unsigned ints peut être interprété comme signé ints sans modifier la variable en aucune façon. C'est pourquoi il est si important de vous assurer que vous utilisez le bon format de chaîne de caractères dans NSLog().  Sinon, vous serez à gauche de vous demander pourquoi votre unsigned variables regardez comme ils les stockent des nombres négatifs. Comme nous allons le voir dans la prochaine section, ce n'est pas tant un problème avec orientée objet types de données.

 Le reste de ce chapitre se concentre sur le Fondement du cadre, qui définit plusieurs orientée objet, structures de données que tous Objective-C, les développeurs devraient être familier avec.


Fondation Des Structures De Données

 Les types de données primitifs sont essentiels à tout Objective-C programme, mais il est souvent fastidieux de travailler sur un si faible niveau. La Fondation cadre des résumés de ces types natifs en haut niveau orienté objet, outils, ce qui vous permet de vous concentrer sur la façon dont votre application fonctionne plutôt de la façon de stocker vos données.

 Les structures de données qui suivent sont communes à la plupart des haut-niveau des langages de programmation, mais depuis qu'il l'Objective-C, ils ont des noms de méthodes permettant de manipuler les données qu'ils contiennent. Le but de cette section est de vous présenter les aspects les plus importants des classes de base définies dans le cadre de la Fondation, plutôt que de fournir une API complète de référence.  Si vous êtes à la recherche pour les seconds, veuillez visiter la Fondation de Cadre de Référence.

NSNumber

 NSNumber est un conteneur générique pour les types numériques (c'est à dire BOOL, char, short, int, long, float et double ).  Il vous permet de prendre l'un des types primitifs discuté plus tôt dans ce chapitre et d'interagir avec elle dans une manière orientée objet. Cela s'appelle de la boxe, et c'est un outil essentiel pour l'intégration de l'Objective-C avec C et C++ bibliothèques.

 NSNumber fournit plusieurs méthodes pratiques pour convertir des valeurs primitives. Par exemple, vous pouvez stocker un nombre entier dans NSNumber avec les éléments suivants:

De même, float s peuvent être créés avec numberWithFloat:, double s peuvent être créés avec numberWithDouble:, BOOL s peuvent être créés avec numberWithBool:, etc., Les valeurs enregistrées peuvent être consultées correspondant à la méthode d'accesseur:

 Accesseurs pour les autres primitives de suivre le même schéma: floatValue, doubleValue, boolValue, etc.

 Rappelez-vous que le %@ spécificateur est utilisé comme un espace réservé pour les objets. La plupart des classes dans le cadre de la Fondation de définir leurs propres formats d'affichage.  NSNumber va simplement afficher sa valeur stockée, donc le format suivant chaîne de sortie exactement la même chose que l'extrait précédent. N'ayant pas de comprendre le spécificateur d'utilisation est l'une des pratiques les avantages de l'utilisation de NSNumber.

Notez que NSNumber est immuable type, de sorte que vous aurez à créer une nouvelle instance, si vous avez besoin de changer la valeur stockée.  Cela peut sembler beaucoup de frais généraux, mais par rapport à tout le reste se passe dans un Objectif-C programme, ce n'est pas vraiment que beaucoup de performances. Bien sûr, si cela devient un problème, vous pouvez toujours vous rabattre sur le C indigènes primitifs.

 Un des autres avantages de NSNumber est la possibilité de définir une variable à zéro pour indiquer une valeur vide. Il n'y a aucun moyen de le faire avec des primitives de valeurs numériques.

NSDecimalNumber

 Le NSDecimalNumber classe Objective-C du point fixe de la classe. Il peut représenter beaucoup plus précis de nombres de type float ou double, et est donc le moyen privilégié pour représenter de l'argent ou d'autres précision des données sensibles.  La façon la plus simple de créer un NSDecimalNumber est d'utiliser le decimalNumberWithString: méthode, comme suit:

 Depuis NSDecimalNumber utilise plus précis algorithmes de calcul de nombres à virgule flottante, vous ne pouvez pas utiliser la norme +, -, * ou / opérateurs. Au lieu de cela, NSDecimalNumber dispose de ses propres méthodes pour l'ensemble de ces opérations:

  •  - decimalNumberByAdding:(NSDecimalNumber *)nombre d'hommes
  • - decimalNumberBySubtracting:(NSDecimalNumber *)nombre d'hommes
  • - decimalNumberByMultiplyingBy:(NSDecimalNumber *)nombre d'hommes
  •  - decimalNumberByDividingBy:(NSDecimalNumber *)nombre d'hommes

 Comme NSNumber, NSDecimalNumber est immuable type, de sorte que toutes ces méthodes renvoient une nouvelle instance de NSDecimalNumber. Par exemple, le prochain extrait multiplie le prix par un pourcentage de remise:

 Toutefois, si vous exécutez cet exemple de code, vous remarquerez qu'il génère un peu plus de décimales après la virgule. Heureusement, NSDecimalNumber fournit des informations détaillées sur les options de configuration de son arrondissement comportement. C'est la raison principale pour utiliser NSDecimalNumber sur la primitive de type float ou double des types de données.  Pour définir votre arrondissement problème, créez une instance de NSDecimalNumberHandler avec vos paramètres souhaités, puis passer à NSDecimalNumber de l'arithmétique des opérations par l'intermédiaire de la withBehavior paramètre. La configuration suivante est utile pour travailler avec les devises:

 Le NSRoundUp argument indique NSDecimalNumber opérations à arrondir (les autres options sont NSRoundPlain, NSRoundDown, et NSRoundBankers).  Ensuite, le paramètre d'échelle définit le nombre maximum de chiffres après la virgule (à noter que les valeurs négatives vont commencer à supprimer les chiffres significatifs à gauche de la virgule).  Le reste des paramètres à définir le comportement de gestion des exceptions de NSDecimalNumber opérations. Dans ce cas, nous allons raconter à ignorer tout ce qui pourrait aller mal, à moins que nous essayons de diviser par zéro.  Ensemble, ces arguments assurez-vous que nous avons toujours deux décimales dans nos valeurs de devise et qu'ils sont toujours arrondis.

 Généralement, une instance de NSDecimalNumber est seulement utile pour interagir avec d'autres NSDecimalNumber objets, mais vous pouvez parfois avoir besoin de les convertir à un autre type de données:

 Le stringValue méthode est particulièrement utile pour l'exportation de valeurs à une base de données ou une autre de stockage persistant (NSDecimalNumber ne doivent jamais être stockées en tant que double, sauf si vous avez vraiment ne se soucient pas de perte de précision). Il est également intéressant de mentionner que les Données de Base du framework ne fournir un natif mécanisme de stockage pour les NSDecimalNumber, même si c'est en dehors de la portée de ce livre.

 NSString

 NSString est l'immuable classe de chaînes de caractères utilisé par la grande majorité de l'Objective-C programmes. Nous avons déjà vu en action dans le Bonjour, Objective-C chapitre, mais nous allons jeter un oeil de plus près à certaines de ses méthodes. Au cœur, NSString est glorifié C tableau d'entiers représentant des personnages. Les deux méthodes de base sont:

  •  -(NSUInteger)longueur - retourne le nombre de caractères dans la chaîne.
  • -(unichar)characterAtIndex:(NSUInteger)theIndex - retourne le caractère à theIndex.

 Ces deux méthodes permet d'itérer à travers les différents caractères dans une chaîne. Par exemple:

 Pourtant, la véritable puissance de NSString vient à son plus haut niveau de fonctionnalité. Certaines des méthodes les plus courantes sont décrites dans la liste suivante, mais gardez à l'esprit que cette liste est loin d'être complète.

  •  +(id)stringWithFormat:(NSString *)format ... - Créer une chaîne de caractères en utilisant le même espace réservé format NSLog().
  • -(NSString *)stringByAppendingString:(NSString *)aString - Ajouter une chaîne à la réception de l'objet.
  • -(NSString *)stringByAppendingFormat:(NSString *)format ... - Ajouter une chaîne en utilisant le même espace réservé format NSLog().
  •  -(NSString *)stringByAppendingFormat:(NSString *)format ... - Ajouter une chaîne en utilisant le même espace réservé format NSLog().
  • -(NSString *)lowercaseString - Retour le minuscule représentation de la chaîne de réception. -(NSString *)substringWithRange:(NSRange)aRange - Retour d'une sous-chaîne résidant dans aRange (voir l'exemple suivant l'utilisation).
  •  -(NSRange)rangeOfString:(NSString *)aString - Recherche pour aString dans la chaîne de réception et de retour de l'emplacement et la longueur de la suite comme un NSRange (voir l'exemple suivant l'utilisation).
  • -(NSString *)stringByReplacingOccurancesOfString:(NSString *)cible withString:(NSString *)de remplacement, Remplacer toutes les occurrences de la cible avec le remplacement.

Cette dernière méthode est un bon exemple de la façon dont détaillé de la nature de l'Objective-C les noms de méthode rend les programmes d'auto-documentation. C'est long à taper, mais personne ne va confondre ce que vous essayez d'accomplir avec cette méthode.  L'exemple suivant illustre quelques-uns de ces plus-méthodes de niveau et vous montre comment utiliser NSRange, qui est une structure contenant l'emplacement et la longueur des champs. NSMakeRange() est une fonction de commodité définies par la Fondation cadre de la création d'une NSRange.

 NSString a aussi la possibilité de lire et d'écrire le contenu d'un fichier, mais nous allons laisser cela jusqu'à ce que le deuxième livre de cette série, iOS de manière Succincte.

NSMutableString

 Comme vous avez probablement pu deviner, NSMutableString est la mutable homologue de NSString. Une mutable chaîne est celui qui vous permet de modifier les caractères individuels sans générer une toute nouvelle chaîne.  Si vous êtes à la réalisation de plusieurs petits changements à une chaîne, une mutable chaîne est plus efficace, car elle change les personnages en place. Est immuable de la chaîne, d'autre part, devrait allouer une nouvelle chaîne pour chaque changement.

NSMutableString est mis en œuvre comme une sous-classe de NSString, si vous avez accès à tous les NSString méthodes, de même que l'ajout de quelques nouvelles méthodes pour manipuler le tableau de caractères en place:

  • -(void)appendString:(NSString *)aString - Ajouter aString à la fin de la chaîne de réception.
  •  -(void)appendFormat:(NSString *)format ... - Ajouter une chaîne en utilisant le même espace réservé format NSLog().
  •  -(void)insertString:(NSString *)aString atIndex (NSUInteger)anIndex - Insérer une chaîne dans l'index spécifié.
  •  -(void)deleteCharactersInRange:(NSRange)aRange - suppression de caractères de la chaîne de réception.
  • -(void)replaceCharactersInRange:(NSRange)aRange withString:(NSString *)aString - de Remplacer les caractères dans aRange avec aString.

 Notez que ces méthodes ont tous des nuls types de retour, tandis que le correspondant NSString méthodes de retour NSString objets. Ceci est révélateur du comportement de mutable instruments à cordes: rien ne doit être retourné, parce que les personnages sont manipulés en place.

 Comme vous pouvez le voir dans cet exemple, le flux de production de base derrière les cordes mutables est bien différent de celui des cordes immuables. Mutable chaîne méthodes fonctionnent sur l'objet, de sorte que vous pouvez utiliser la même variable, changeant son contenu à la volée.  Immuable méthodes string besoin de plusieurs variables; bien sûr, on pourrait attribuer la nouvelle chaîne de la même variable, mais les nouvelles chaînes serait encore généré derrière les coulisses.

 Parfois, il est difficile de savoir quand utiliser immuable contre mutable types de données. Les cordes mutables sont souvent des cas d'utilisation spécifiques (par exemple, un analyseur linguistique qui fonctionne sur les jetons), donc si vous n'êtes pas sûr si vous en avez besoin, vous n'avez probablement pas.  Pour quelque chose comme l'exemple précédent, immuable chaîne serait plus approprié.

NSArray

 Les tableaux sont des collections ordonnées d'objets qui vous permettent de maintenir et organiser des listes de données. Comme NSString, NSArray est immuable, de sorte que son contenu ne puisse être modifié sans en faire la demande entièrement nouvelle matrice.  Le plus important NSArray méthodes sont indiquées dans la liste suivante. Encore une fois, ce n'est qu'un sondage, pas une vue d'ensemble complète:

  •  +(id)arrayWithObjects:(id)firstObject, ... - Créer un nouveau tableau en passant dans une liste d'objets.
  •  -(NSUInteger)le comte - Retourner le nombre d'éléments dans le tableau.
  •  -(id)objectAtIndex:(NSUInteger)anIndex - Retour de l'élément du tableau à l'indice anIndex.
  •  -(BOOL)containsObject:(id)anObject - Retour si oui ou non anObject est un élément du tableau.
  •  -(NSUInteger)indexOfObject:(id)anObject - Retour à l'index de la première occurrence de anObject dans le tableau. Si l'objet n'est pas dans le tableau, le retour de la NSNotFound constante.
  •  -(NSArray *)sortedArrayUsingFunction:(NSInteger (*)(id, id, void *))compareFunction contexte:(void *)contexte - Trier un tableau en comparant les objets ayant une fonction définie par l'utilisateur (voir le deuxième exemple qui suit pour l'utilisation).

 Notez que toutes ces méthodes utilisent l'objet générique id de type de leurs arguments. Par conséquent, NSArray ne peut manipuler des objets, qui ne peut pas être utilisé avec les types de données primitifs.  La fonction pratique de classes comme NSNumber devrait maintenant être plus clair: ils facilitent la boxe.  C'est qu'ils permettent d'utiliser le char, int, float, etc., avec NSArray, les envelopper dans un orientée objet conteneur. Par exemple, le fragment de code suivant montre comment vous pouvez utiliser NSArray de gérer une liste de valeurs float:

 Par rapport à la primitive C des tableaux, NSArray offre beaucoup de haut niveau de fonctionnalités, mais bien sûr, il a un coût. La boxe peut être une opération coûteuse pour des applications de haute performance.  Imaginez un programme graphique à l'aide de dizaines de milliers de chars pour représenter les sommets dans un espace 3d. La création que de nombreux NSNumber objets juste pour le plaisir de NSArray la compatibilité n'est pas une utilisation efficace de la mémoire ou de cycles de PROCESSEUR.  Dans ce genre de situation, vous êtes probablement mieux coller avec natif C des tableaux et en travaillant directement avec les types de données primitifs.

La signature de la sortedArrayUsingFunction: méthode peut sembler intimidant, mais c'est en fait un moyen relativement simple de définir un algorithme de tri personnalisé pour un tableau. Tout d'abord, vous devez définir la fonction de tri:

Inclus échantillon de code: ArraySort

 Ceci définit une très simple tri dans l'ordre croissant, mais il démontre les composants essentiels d'une fonction de tri. L'item1 et item2 arguments sont les deux éléments actuellement en cours de comparaison.  Puisque les valeurs sont abrités dans un NSNumber, nous avons besoin de sortir les valeurs avant de les comparer.  Puis nous faisons la comparaison réelle, de retour NSOrderedAscending quand item1 doit être placé avant item2, NSOrderedDescending quand il devrait l'être après item2, et le retour NSOrderedSame quand ils n'ont pas besoin d'être triés.  Nous pouvons utiliser cette fonction de tri de la sorte:

 La deuxième NSLog() la sortie doit afficher les nombres en ordre croissant à partir de -2.9 à 22,5. sortedNumbers est un tout nouveau tableau, et les numéros de variable reste inchangé. Cependant, ils pointent vers le même cas de n1, n2, n3 et n4.

NSMutableArray

 NSMutableArray est la mutable homologue de NSArray. Il est possible de changer les éléments après le tableau a été alloué et de l'étendre ou de réduire la matrice par un nombre arbitraire d'éléments. Bien que pas aussi efficace que NSArray, la possibilité de mettre à ajouter ou supprimer des éléments de fait NSMutableArray une structure commune de données en Objective-C applications.  NSMutableArray est une sous-classe de NSArray, de sorte que les deux peuvent être créés, accessibles et triés à l'aide de méthodes dans la section précédente, mais ils fournissent également un supplément de quelques méthodes pour la manipulation de leur contenu:

  •  +(id)arrayWithCapacity:(NSUInteger)numItems - Créer un vide mutable tableau. Le numItems argument est utilisé comme une taille de soupçon, de sorte qu'il devrait être à peu près le nombre de points initiaux vous prévoyez de stocker.
  • -(void)addObject:(id)anObject - Ajouter l'objet à la fin de la matrice existante.
  •  -(void)insertObject:(id)anObject atIndex:(NSUInteger)anIndex - Insérer l'objet donné dans l'index spécifié.
  • -(void)removeObjectAtIndex:(NSUInteger)anIndex - la suppression de l'objet à l'index spécifié.
  • -(void)removeAllObjects - pour Effacer le tableau.
  •  -(void)replaceObjectAtIndex:(NSUInteger)anIndex withObject:(id)anObject - Remplacer l'objet à anIndex avec anObject.
  • -(void)exchangeObjectAtIndex:(NSUInteger)index1 withObjectAtIndex:(NSUInteger)index2 - Swap l'emplacement des deux objets dans le tableau.

Notez que la plupart de ces mutable méthodes sont essentiellement "écrire" des méthodes, tandis que les méthodes décrites dans le NSArray section sont pour la plupart "lire" méthodes.  En outre, la mutable trier les méthodes sont les mêmes que NSArray, à l'exception de trier le tableau en place au lieu de générer un nouveau tableau. Ces différences sont sensiblement les mêmes que NSString contre NSMutableString. Un exemple simple illustrant l'utilisation de NSMutableArray comme une file d'attente suit:

NSSet et NSMutableSet

 Ensembles représentent également une collection d'objets, mais à la différence des tableaux, ils sont des collections non triées. En outre, tous leurs éléments doivent être uniques.  Si vous n'avez pas de soins sur l'ordre des éléments ou vous voulez vous assurer que vous n'avez pas de doublons dans la collection, vous devez utiliser NSSet et NSMutableSet au lieu d'un tableau.  En outre, les jeux sont optimisés pour l'adhésion de la vérification, donc si votre code est à poser beaucoup de questions du genre "Est-ce de l'objet dans ce groupe?", vous devez certainement être l'aide d'un ensemble au lieu d'un tableau.

Figure 17 Ordered arrays vs unordered sets

Matrices ordonnées vs non ordonnée ensembles

Structures de données reflètent les relations sous-jacentes entre leurs éléments. Le tableau de l'interprétation de la figure précédente, pourrait être quelque chose comme, "Dave est en charge, puis Heywood, puis Frank, et enfin HAL", alors que l'ensemble de l'interprétation est plus générique: "Dave, Heywood, Frank, et HAL sont une partie de l'équipage."

 Autres que de commander, les décors et les tableaux sont très similaires fonctions et les Api. Certaines des méthodes les plus utilisées sont:

  •  +(id)setWithObjects:(id)firstObject, ... - Créer un nouveau fixé par le passage d'une liste d'objets.
  •  +(id)setWithArray:(NSArray)anArray - Créer un nouveau jeu avec le contenu d'un tableau. C'est un moyen simple de supprimer les doublons d'un NSArray.
  •  -(NSUInteger)le comte - de Retour, le nombre de membres dans le jeu.
  •  -(BOOL)containsObject:(id)anObject - Retour OUI si l'objet spécifié est un membre de l'ensemble, PAS autrement. NSArray possède une méthode identique, mais le NSSet la version la plus efficace.
  • -(NSArray *)allObjects - Retour d'un NSArray contenant tous de l'ensemble des membres.

 Vous pouvez itérer sur les membres d'un ensemble à l'aide Objective-C rapide énumération de syntaxe, comme le montre l'exemple suivant. A noter que depuis NSSet est pas ordonné, il n'y a aucune garantie quant à la façon dont les objets apparaîtront au cours de l'itération:

 La Fondation framework fournit également une mutable version de NSSet appelé NSMutableSet. Comme NSMutableArray, vous pouvez modifier une mutable ensemble après la création. Certains de ces "écrire" méthodes sont les suivantes:

  • -(void)addObject:(id)anObject - Ajouter l'objet spécifié à l'ensemble. Dupliquer les membres seront ignorés.
  •  -(void)removeObject:(id)anObject - Supprimer l'objet spécifié à partir de l'ensemble.
  •  -(void)unionSet:(NSSet *)otherSet - Ajouter chaque élément dans otherSet à la réception de définir si c'est pas déjà membre.

 À la fois le immuable et changeante des versions de NSSet fournir plusieurs autres méthodes pour des opérations logiques comme les intersections et de l'égalité. Veuillez voir la référence officielle pour plus d'informations.

NSDictionary et NSMutableDictionary

 Dictionnaires, aussi appelé tableaux associatifs, sont non ordonnée des associations de paires clé-valeur. Il est possible d'utiliser n'importe quel objet comme une clé ou une valeur, de sorte que les dictionnaires peut être utilisé pour quoi que ce soit de l'attribution dynamique des rôles à des objets à la cartographie de la chaîne de commandes pour les fonctions.

Figure 18 Unordered key-value pairs

Non ordonnée des paires clé-valeur

 Comme les chaînes, les tableaux, et, il n'y est immuable et une mutable version. Certaines des méthodes les plus courantes pour NSDictionary sont:

  •  +(id)dictionaryWithObjectsAndKeys:(id)firstValue, (id)firstKey, ... - Créer un dictionnaire en passant paires clé-valeur en tant que paramètres. Tous les deux objets dans la liste des paramètres à définir une paire, et le premier objet que définit la valeur, tandis que le second objet définit la clé de cette valeur (voir l'exemple suivant l'utilisation).
  •  -(NSUInteger)le comte - retourne le nombre d'entrées dans le dictionnaire.
  •  -(id)objectForKey:(id)aKey - Retour de l'objet (valeur) associés à aKey, ou nil si il n'y a pas d'entrée pour aKey.
  • -(NSArray *)allKeys - de Retour d'un nouveau tableau contenant toutes les clés dans le dictionnaire.
  •  -(NSArray *)allValues - de Retour d'un nouveau tableau contenant toutes les valeurs dans le dictionnaire.
  •  -(NSArray *)allKeysForObject:(id)anObject - de Retour d'un nouveau tableau contenant toutes les clés associés avec anObject. Notez qu'il est possible d'avoir plusieurs clés associé à un objet unique, de sorte que les touches doivent être retournées dans un tableau, pas un objet unique.

 Les deux principales méthodes pour NSMutableDictionary sont décrites dans la liste suivante. Encore une fois, notez que ce sont les "écrire" des méthodes pour "lire" les méthodes de NSDictionary.

  •  -(void)setObject:(id)anObject forKey:(id)aKey - Ajouter une nouvelle paire clé-valeur pour le dictionnaire. Le aKey argument doit être conforme à la NSCopying protocole (voir les Protocoles chapitre pour plus d'informations).  Tous les objets que nous avons discuté jusqu'à présent sont conformes à ce protocole, de sorte que vous n'avez pas besoin de s'inquiéter à ce sujet, sauf si vous utilisez des classes personnalisées comme des clés.
  •  -(void)removeObjectForKey:(id)aKey - Supprimer l'entrée à l'aide de aKey que sa clé.

Comme NSSet, les dictionnaires peuvent être itéré en utilisant le fast-dénombrement de la syntaxe, comme montré ici:

 Cela devrait générer les éléments suivants dans votre console, même si les éléments peuvent apparaître dans un ordre différent:

 L'Id De Type De Données

 Bien que pas techniquement partie de la Fondation de cadre, c'est le moment opportun d'introduire le type d'id, qui est le générique de l'objet type de données. Il peut contenir un pointeur vers n'importe quel Objective-C objet, indépendamment de sa classe.  De ce fait, il est possible de stocker différents types d'objets dans une seule variable, ouvrant la porte à la programmation dynamique. Par exemple, l'id vous permet de stocker une NSNumber, un NSDecimalNumber, ou un NSString dans la même variable:

 Notez que l'id implique que la valeur est un pointeur, donc les déclarations de variables n'ont pas besoin d'un astérisque devant le nom de la variable. En d'autres termes, les variables doivent toujours être déclarés comme id mysteryObject, pas d'id *mysteryObject.

 Depuis une variable d'id de ne pas vérifier ce genre d'objet qu'il contient, c'est le programmeur de la responsabilité pour fait en sorte qu'il ou elle n'a pas l'appel de méthodes ou d'accéder à des propriétés qui ne sont pas définies sur l'objet (par exemple, ne pas essayer d'appeler stringValue lorsque la variable contient un NSString instance.

Le Type De Données De Classe

 Objective-C classes sont en fait des objets eux-mêmes, et ils peuvent être stockés dans des variables à l'aide de la Classe type. Vous pouvez obtenir la classe de l'objet associé à une classe en particulier par l'envoi de la classe message.  L'exemple suivant montre comment récupérer un objet de classe, de le stocker dans une variable de Classe, et de l'utiliser pour comprendre quel type d'objet est stocké dans une variable id:

 Le type de données de Classe apporte les mêmes fonctionnalités dynamiques pour les classes id apporte aux objets.

 Foundation Data Structures Summary

 Les classes présentées dans la seconde moitié de ce chapitre est de fournir la base pour presque tous Objective-C programme. Chaînes de caractères, des tableaux, des jeux, et les dictionnaires sont à la base de presque tous les langages de programmation et d'avoir une interface de haut niveau pour la représentation des données est un aspect important de la productivité.  Nous avons également vu comment Objective-C doit boîte de primitives C pour une utilisation avec ces Foundation classes du framework, ce qui fournit un moyen pratique de l'API au détriment des performances et de la mémoire. Bien sûr, vous êtes toujours libre de travailler avec des types de données primitifs dans un Objectif-C programme.

Nous avons également examiné deux plus orientée objet types de données disponibles pour Objective-C applications: id et Class. Ensemble, ces ouvrir un large éventail de possibilités pour l'organisation d'une application.

Cette leçon représente un chapitre de l'Objectif-C, de façon Succincte, un eBook libre de l'équipe de Syncfusion.
Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.