1.8 Les classes utilitaires d’Objective-C – NSString – NSArray – etc.

NSLog - NSString - NSArray - NSDictionary - NSEnumerator - NSDate et NSDateFormatter

Objective-C

Introduction

Le débutant en Objective-C va rapidement chercher les classes utilitaires du langage, un peu comme le développeur C++ va chercher à comprendre la STL.

Nous allons ici expliquer avec quelques exemples, les classes :

NSLog
NSMutableString et NSString
NSArray et NSMutableArray
NSMutableDictionary et NSDictionary
NSEnumerator
NSDate et NSDateFormatter

NSLog

Cette classe est toute simple, elle permet d’afficher dans la console des chaînes de caractères.


NSLog(@"Hello Objective-C");

On remarque la chaîne de caractère démarre par un @. Une chaîne C au contraire, ne démarre pas par @.

NSMutableString et NSString

Comme quasiment toutes les classes utilitaires Objective-C, il existe la version mutable et la version constante. La chaîne de caractère est codée en Unicode, c’est à dire qu’un caractère occupe 2 octets.

Création d’un chaîne constante

NSString * ps = @"coucou";

C’est la méthode la plus simple et la plus performante pour créer une chaîne. On remarque qu’ici la création d’un objet n’apparaît pas.

NSString * ps2 = [NSString stringWithFormat:@"date = %@", [NSDate date]];

Seconde méthode de création d’un chaîne avec une méthode statique : la chaîne comporte une partie constante et une partie dynamique : ici on prend la date d’aujourd’hui.
Remarque : En cas où vous n’utilisez pas l’ARC, sachez que vous n’aurez pas à faire de release sur l’objet, celui-ci est en autorelease. Il s’agit ici d’une des méthodes de création les plus utilisée.

NSString * ps3 = [[NSString alloc]
                         initWithFormat:@"date = %@", [NSDate date]];

Ici on appel le constructeur surchargé initWithFormat:. Sans l’ARC on aura à relâcher notre objet.

Longueur de la chaîne

int longueur = ps.length;

Retourne la longueur de la chaîne.

Chercher un caractère à une position donnée

unichar c = [ ps characterAtIndex: 1];

On cherche le caractère à la seconde position. le type unichar représente un caractère en unicode.

unichar c2 = [ ps characterAtIndex:10];

Ici on cherche un caractère à une mauvaise position -> SIGABRT (crash)

NSMutableString et se méthode append:

NSMutableString * pms = [NSMutableString
                            stringWithFormat:@"%@", ps3];
[pms appendString:@" du jour"];

Création d’un chaîne modifiable. Le message appendString: permet d’ajouter une autre chaîne.

NSArray et NSMutableArray

Ces classes permettent de gérer des tableaux.

Création d’un tableau

NSArray * pArray = [NSArray arrayWithObjects:@"1", @"2", nil];

Cette méthode statique permet de créer un objet contenant 2 objets qui sont des NSString. On remarquera le mot clé nil pour délimiter la fin du tableau (obligatoire).

En modern objective-c :

pArray = @[@"3", @"4"];

Apple a introduit modern objective-C. Si votre compilateur le permet (à partie de XCode 4.4), cette syntaxe simplifiée est beaucoup plus aisée que la syntaxe à base de crochets. Ici pas de mot clé nil.

Itération dans un tableau

for( int t = 0; t < pArray.count; t++ ) {
    NSLog( @"%@", [pArray objectAtIndex:t]);
}

Pour obtenir le nombre l’éléments dans un tableau on utilise la propriété count. La méthode objectAtIndex: permet d’obtenir un objet à un index donnée. Attention si un mauvais indice est passé à objectAtIndex: c’est le crash assuré.

Enumération des éléments d’un tableau

NSEnumerator * pEnumerator = [pArray objectEnumerator];
id obj = nil;
while( obj = [pEnumerator nextObject] ) {
    NSLog( @"%@", obj );
}

L’idée ci-dessus est de démontrer comment utiliser un énumérateur (pattern du GOF) pour parcourir le tableau. Il à noter que ce mécanisme est également disponible dans le dictionnaire. [pArray objectEnumerator] retourne un objet du type NSEnumerator qui va nous permettre de parcourir le tableau. [pEnumerator nextObject] retourne l’objet suivant jusqu’à nil pour signaler la fin du tableau.

Obtenir le dernier objet du tableau

id o = [pArray lastObject];

Méthode très pratique pour obtenir l’objet qui se trouve sur le dernier index.

Un objet est-il présent dans le tableau ?

if( [pArray containsObject:o] ) {
    //...
}

Message permettant de savoir si notre tableau contient un objet donné.

Manipulation du système de fichiers

NSFileManager * pFileManager = [NSFileManager defaultManager];
NSString * pPath = [NSString stringWithFormat:@"%@/monFichier.xml",
                         [pFileManager currentDirectoryPath]];
NSLog(@"%@", pPath);

Petite digression pour ici calculer le path d’un fichier qui sera utilisé plus bas. NSFileManager est une classe très importante qui permet de gérer le système de fichier (ou un système de fichier). [NSFileManager defaultManager] retourne le système de fichier courant. [pFileManager currentDirectoryPath] nous retourne le répertoire courant de notre programme, on ajoute le nom d’un fichier XML : tout est prêt pour la suite.

Ecriture d’un tableau sur disque en XML

BOOL b = [pArray writeToFile:pPath atomically:YES];
if( b== YES ) {
    NSLog(@"OK");
}

La fonction ci-dessous permet de sérialiser l’objet sur disque en XML, suivant un schéma Apple.

NSDictionary et NSMutableDictionary

Le dictionnaire est très utilisée : il permet de ranger des objets avec une clé. clé: valeur.

Création d’un dictionnaire

NSDictionary * pDict = [[NSDictionary alloc] initWithObjects:pArray
                                forKeys:@[@"key1", @"key2"]];

Création d’un dictionnaire avec un constructeur. Le premier paramètre est un tableau d’objets, le second est un tableau des clés correspondantes.

Création d’un dictionnaire en modern Objective-C

pDict = @{@"key3" : @"5", @"key4" : @"6"};

Création d’un dictionnaire en modern Objective-C. Cette syntaxe est utilisée depuis 2012.

Nombre d’éléments dans le dictionnaire

int nbr = pDict.count;

Retourne le nombre d’éléments dans le dictionnaire.

Obtenir un objet à une clé donnée

id objet = [pDict objectForKey:@"key3"];

La méthode [pDict objectForKey:@ »key3″] retourne l’objet qui se trouve à la clé key3.

Obtenir toutes les clés et tous les objets

NSArray * pArray2 = [pDict allKeys];
pArray2 = [pDict allValues];

La méthode allKeys retourne un tableau de toutes les clés. La méthode allValues retourne le tableau des objets.

Ecrire le dictionnaire sur disque

b = [pDict writeToFile:pPath atomically:YES];

La méthode writeToFile: permet de sérialiser l’objet sur disque en XML.

NSDate – NSDateFormatter – NSLocale

La gestion des dates est faite par la classe NSDate. NSDateFormatter est utilisé pour gérer une chaîne de caractères qui représente la date : avec l’heure ou pas, en format court, intermédiaire ou long. La classe NSLocale permet de gérer le code ISO d’un pays donné.

Création d’une date

NSDate * pDate = [NSDate date];

Créer un objet du type NSDate avec le moment présent.

Calcul d’une date par rapport à une autre

NSTimeInterval ti = [pDate timeIntervalSince1970];

NSTimeInterval n’est pas une classe mais un typedef. En fait c’est un double qui retourne le nombre de milli-secondes depuis le 1er Janvier 1970 (timer UNIX).

Calcul d’une date par rapport à une chaîne de caractères

NSDate * pDate2 = [NSDate dateWithString:@"1963-04-20 12:00:00 +0000"];

Cette méthode statique permet de créer un objet depuis une chaîne. A noter que la chaîne est un format standard : « YYYY-MM-DD HH:MM:SS +/-XXXX ».

NSDateFormatter – chaîne de représentation

NSLocale * pLocale = [NSLocale currentLocale];
NSDateFormatter * pDF = [[NSDateFormatter alloc]init];
[pDF setLocale:pLocale];

Le message [NSLocale currentLocale] retourne un objet qui contient le code ISO du pays courant. [pDF setLocale:pLocale] présente le code pays dans un objet du type NSDateFormatter.

Précision du format de la date

[pDF setTimeStyle:NSDateFormatterFullStyle];
[pDF setDateStyle:NSDateFormatterLongStyle];

Ici on fixe les styles pour la chaîne de caractère qui représentera la date. Par exemple format court, moyen ou long.

NSLog( @"%@", [pDF stringFromDate:pDate2] );

La méthode stringFromDate d’utiliser de calculer la chaîne de représentation d’une date, avec une date et son format de représentation.

J’espère que cet article vous a été utile.

N’hésitez pas à le partager avec la communauté en cliquant ci-dessous.

Au sujet du formateur

bertrand

Bertrand Leclercq

Expert iOS et Android, aide votre entreprise à développer sur mobile, anime vos formations développeurs, conseille vos équipes

Contacter le formateur
Catégories
0 Comments
0 Pings & Trackbacks

Laisser un commentaire