Curiosité NSString
chaps31
Membre
Juste une question par curiosité :
Je viens de découvrir avec un "if" que l'on ne peut pas comparer 2 NSString avec "==" mais qu'il faut utiliser isEqual comment cela se fait-il, bizarre quand même l'objective-c
Je viens de découvrir avec un "if" que l'on ne peut pas comparer 2 NSString avec "==" mais qu'il faut utiliser isEqual comment cela se fait-il, bizarre quand même l'objective-c
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Pas isEqual, mais isEqualToString...
ça n'a rien de bizarre, c'est de la programmation objet.
Si tu fais "==" tu compares les adresses ; ça ne veut rien dire.
Le "==" ne permet que de comparer des données atomiques, cà d des types "C" standard : int, char, bool, long, ...
Si tu fais un "==" sur des "int *" ou des "char *" en C, ça ne va que comparer les pointeurs, pas les données.
Et comme en Objective-C, tout est pointeur (NSString* par exemple)... avec un "==" tu vérifies que c'est le même objet exactement (par exemple pour comparer si un outlet reçu en paramètre est tel ou tel autre outlet, mais sinon c'est plutôt rare), ce qui n'est pas la même chose que de comparer si les deux objets ont le même contenu.
C'est d'ailleurs plus parlant en prenant de NSMutableStrings :
Ici a et b sont deux objets distrincts, mais il se trouve qu'ils représentent une chaà®ne qui est la même. Alors que a et c sont exactement les mêmes objets.
Ainsi [tt](a == c)[/tt] est vrai, mais [tt](a == b)[/tt] est faux. Alors que, à ce stade du code, [tt][a isEqualToString:b][/tt] est vrai.
Par contre, si on modifie par la suite l'objet a ([tt][a appendString:@zzz][/tt] par ex.), Les variables a et c, qui pointent vers le même objet, représenteront tous deux la chaà®ne "abcdefzzz", puisqu'ils pointent toujours sur le même objet, alors que la variable b restera inchangée et représentera la chaà®ne "abcdef". Et du coup à ce stade du code [tt][a isEqualToString:b][/tt] devient faux. (Alors que [tt][a isEqualToString:c][/tt] est vrai puisque a et c étant le même objet, cela revient à écrire [tt][a isEqualToString:a][/tt]
Au passage du coup j'avais fais une faute de frappe et écris "isEqualTo" qui marche aussi...
Et puis en plus, c'est le contraire :
:P
Comment mettre un Char dans un NSString???
On lit la doc :P
Pour la doc, je te conseille AppKiDo
Merci
Alors télécharge AppKiDo vite fait bien fait...
Et toi tu lui donnes un "char" tout court et sans terminateur.
ou bien [texte initWithFormat:@%c,saisie];
identique au C :
char chaine[20];
sprintf(chaine,"%c",saisie);
Juste une question simple, comment faire pour afficher les caractères non ASCII é,à ,è... ?
Oups je n'avais pas vu les messages précédents, désolé de m'intercaler...
On utilise le fichier de chaà®nes localisées... Mais c'est une question qui a déjà été posée 1000 fois ici :P
En gros faut mettre tes chaà®nes dans des fichiers (au format texte et encodés en UTF-8) à côté de ton appli, et c'est là dedans que tu vas piocher tes constantes de chaà®nes. Comme ça tu es sûr que c'est :
- indépendant de ton code source, plus logique que mettre tout en dur
- utilisant le bon encodage de caractères, donc permettant aussi de gérer les caractères >127 genre accents, etc
- et en plus ça permet (et c'est aussi l'intérêt premier à la base) de faire des fichiers dépendants de la langue (un fichier de chaà®ne par langue dans laquelle tu vas traduire ton appli à la fin)
......
EDIT : OK, j'ai compris créer le fichier .string remplir de "remplacepar"="ma chaine avec des é" et voilà .
Mais pas très pratique, en l'occurence je n'ai pas de chaine constante il s'agit de récupérer des chaines de NSTextField, en gros quand l'utilisateur va taper un é è ê à ô... je veux que ça soit bien enregistré (envoie à une base de donnée) avec le NSLocalizedString ça ne m'a pas l'air possible vu qu'il s'agit si j'ai bien compris de chaines pré-enregistrés, donc je ne vois pas trop comment lui dire : quand tu rencontre un é (qu'il ne reconnait pas... donc coment lui présenter le é) remplace par un é (que tu reconnais...).
J'ai dû louper un truc je le sens
En effet en premier j'ai des messages d'alerte avec des accents, là nslocalizedsstring semble approprié (mais je n'ai pas encore trouvé de mode d'emploi clair), mais comment faire pour du texte rentré par l'utilisateur et donc non connu à priori, comment modifier les é è... pour avoir le bon texte... (avant de l'envoyer à ma BDD). :)beta:
Alors les NSLocalizedString c'est à utiliser à la place de mettre des chaà®nes littérales en dur dans ton code.
Par exemple pour les messages d'alerte que tu pourrais vouloir générer par code, etc.
Pour récupérer du texte depuis ton interface, il n'y a aucun problème avec les "é" et autres "è".
Ou plutôt le seul truc c'est qu'il faut faire attention à ce que tu utilises les mêmes encodages de texte de chaque côté.
Sachant que les objets graphiques (NSTextField & co) utilisent tous l'encodage UTF-8.
Donc soit tu migres ta base en UTF8 (c'est un réglage au niveau de ta base de données elle-même en général pour lui dire avec quel encodage de texte stocker les chaà®nes dans la base), soit tu fais la conversion de UTF-8 vers l'encodage utilisé dans ta base (ISO-8859-1 ?), en utilisant les méthodes de NSString (dataUsingEncoding: ou CStringUsingEncoding: par exemple, etc) pour envoyer à ta base la chaà®ne convertie dans le bon encodage.
Merci
Si on sait pas celui que tu utilises, on aura du mal...
Donc si certains d'entre vous utilise des bases postgre... le framework (pgcocoaDB )marche mais il y a ce pb d'encodage texte...
http://sourceforge.net/projects/pgsqlcocoa/
[glow=yellow,2,300]Connected to database MaDataBase on 2008-04-04 12:55:24 +0200.
PostgreSQL Error: ERROR: invalid byte sequence for encoding "UTF8": 0x8e
HINT: This error can also happen if the byte sequence does not match the encoding expected by the server, which is controlled by "client_encoding".
[/glow]
OK, ce n'est plus vraiment un problème cocoa, mais vous savez à quoi correspond le 0x8e ? Je ne vois pas quel type d'encodage est utilisé...
J'ai créé sous X-code un fichier vide que j'ai rempli de :
[glow=yellow,2,300]"alertOne"="Mon premier message d'alerte avec accents";
....[/glow]
Sauvegardé et mis dans les ressources de mon projet.
Puis : [glow=yellow,2,300]NSRunAlertPanel(@Le titre,NSLocalizedString(@alertOne,nil),@OK,nil,nil);[/glow]
ET là ça m'affiche... [glow=yellow,2,300]Le titre alertOne[/glow] :-\\<br />et pas : [glow=yellow,2,300]Le titre Mon premier message d'alerte avec accents[/glow]
Je pense qu'il y a un truc que je n'ai pas compris et je ne comprends pas ce que je n'ai pas compris :P Et comme d'hab' la doc cocoa sur le net c'et pas évident de trouver de bonnes sources (sauf ici )
EDIT : Ho... Menu File-Make Localizable, je m'empresse de cliquer, "attention cela va modifier ...gnagnagna", même pas peur, et hop je vois qu'il a créé des info.plist ok, je ne sais pas trop ce que c'est et que le projet est localisé en English, heu.. non là en français, comment je change ça ? Bon pas trouvé... Je lance et... toujours pareil... Ca n'a rien changé...
EDIT : Whaou je suis passé planteur de pousse...
Moi je nomme le fichier Localizable.strings
Dans le menu Build, sélectionne l'option Clean All Targets pour nettoyer les fichiers déjà compilés.
Renomme ton fichier
Build & Run