Bienvenue dans ma série sur la découverte du langage génial qu'est Objective-C. Tout au long de cette petite série d'articles, mon objectif est de vous faire passer d'une expérience sans précédent avec Objective-C à son utilisation en toute confiance dans vos propres applications. Ce n'est pas un travail urgent. Ne vous attendez donc pas à survoler les bases et à vous évader. Nous ne ferons pas le nécessaire, mais nous appliquerons également les meilleures pratiques que vous pouvez appliquer pour vous assurer que votre code est le meilleur. ça peut être. Sautons directement dans!
Si vous lisez cette série, je vous laisse deviner ce que vous savez déjà, mais pour ceux qui ne le savent pas, ne vous inquiétez pas, car à la fin de cette partie, vous saurez ce que c'est que de retour -front et à l'envers.
Objective-C est un langage orienté objet qui se situe au-dessus du langage C (mais je parie que vous avez deviné cette partie!). Son utilisation principale dans l'informatique moderne concerne Mac OS X en tant que langage de bureau et également sur iPhone OS (ou comme il s'appelle désormais: iOS). C'était à l'origine le langage principal du système d'exploitation NeXTSTEP, également appelé système d'exploitation utilisé par Apple, qui l'a acheté et qui l'a descendu, ce qui explique pourquoi son foyer principal se situe aujourd'hui sur les systèmes d'exploitation Apple..
Parce que Objective-C est un sur-ensemble strict de C, nous sommes libres d’utiliser C dans un fichier Objective-C et la compilation se fera sans problème. Parce que tout compilateur d'Objective-C compilera également tout code C direct qui y est passé, nous avons toute la puissance de C ainsi que la puissance des objets fournis par Objective-C..
Si vous êtes un peu perplexe à ce stade, réfléchissez de la façon suivante: tout ce que le C peut faire, Objective-C le peut aussi, mais pas l'inverse..
Tout au long de cette série, nous ne nous concentrerons pas sur la création d’applications pour iPhone. Au lieu de cela, nous allons nous concentrer davantage sur le langage lui-même et pour cette raison, tout ce dont vous aurez besoin est un Mac avec un compilateur tel que GCC. Si vous avez installé les outils de développement Apple (Xcode, Interface Builder, etc.), alors GCC devrait déjà être installé. Sinon, rendez-vous sur le site Web des développeurs d’Apple et procurez-vous un exemplaire gratuit..
Pour ce qui est des conditions préalables, bien que je ne s’attende pas à ce que vous ayez une formation complète en informatique, une certaine connaissance de la programmation en général ou du langage C en particulier serait certainement un atout. Si vous n'avez pas beaucoup d'expérience préalable en programmation, ne vous inquiétez pas, vous la récupérerez en un rien de temps.!
Si vous utilisez Windows (ce qui est peu probable car ce tutoriel est destiné aux développeurs iPhone), vous pouvez toujours compiler Objective-C sur votre système à l'aide d'un compilateur tel que CygWin ou MinGW. Cette série de tutoriels s'adresse aux utilisateurs de Mac, mais si vous utilisez Windows et rencontrez des problèmes, veillez à laisser un commentaire et je verrai si je peux vous aider..
Avant de voir votre code en action, vous devez être capable de le compiler en quelque chose d'exécutable. J'espère que vous avez maintenant votre copie de GCC prête. La compilation est vraiment facile, une simple commande d'une ligne.
REMARQUE:
La compilation est le processus de "traduction" d'un langage informatique de haut niveau, comme Objective-C ou PHP, en un code machine de bas niveau pouvant être traité par un ordinateur lors de l'exécution du programme..
Tous les programmes que nous voyons fonctionner dans notre système d'exploitation Mac OS sophistiqué consistent en une série d'instructions qui nous sont affichées de manière visuelle dans une interface graphique ou une interface utilisateur graphique. Contrairement à l’interaction du programme de l’interface graphique avec une souris que la plupart d’entre nous connaissons, il est possible d’émettre des commandes directement au système d’exploitation via une interface textuelle appelée "terminal" ou "ligne de commande".
L’application en ligne de commande sous Mac OS s’appelle Terminal et se trouve dans Applications -> Utilitaires. Allez-y et ouvrez Terminal maintenant (vous pouvez également le rechercher dans Spotlight). Le terminal dispose de plusieurs commandes de base dont vous devez tenir compte pour l’utiliser correctement. L’une des commandes les plus importantes à connaître est CD, qui signifie "changement de répertoire". Cette commande nous permet de changer l’emplacement de lecture du terminal dans le système de fichiers. Nous ne pouvons pas simplement dire à Terminal de compiler notre fichier si nous ne le montrons pas à l’endroit où il se trouve en premier! Pour basculer vers un répertoire souhaité, vous pouvez utiliser un chemin complet, tel que:
cd / Utilisateurs / MonNom / Bureau / Test
Vous pouvez également utiliser des chemins relatifs, vous permettant de ne saisir qu'un seul nom de dossier dans certains cas. Par exemple, si vous êtes déjà dans votre dossier Bureau, vous pouvez simplement taper:
Test de CD
accéder au dossier de test.
Et si vous voulez voir où vous en êtes actuellement? Le nom du dossier immédiat est affiché avant l'invite (le bit où vous tapez). Par exemple, si votre invite dit Dan- Walkers-MacBook: Desktop iDemonix $ Je peux supposer que je suis dans le dossier Desktop. Si vous n’êtes pas sûr, vous pouvez aussi taper pwd pour afficher le chemin de fichier absolu de l'emplacement actuel.
Si vous souhaitez répertorier les fichiers et les dossiers du dossier actuel, utilisez la commande list: ls. Enfin, si vous souhaitez monter un répertoire dans un dossier parent, tapez "CD… ". Ainsi, si nous nous trouvions dans le dossier Test, qui se trouve dans le dossier Bureau, mais que nous voulions plutôt aller dans le dossier Bureau, nous pourrions taper CD… pour aller au répertoire parent, Desktop. Si nous voulions accéder au répertoire personnel, nous tapions cd… /… monter de deux niveaux. Alternativement, pour accéder au répertoire personnel, vous pouvez simplement taper cd ~ de partout.
Lors de l'utilisation de l'application Terminal, la compilation se présente comme suit:
gcc inputfile.m -o fichier de sortie
Vous avez probablement déjà deviné comment cela fonctionne: inputfile.m contient notre code (.m est l'extension utilisée pour les fichiers Objective-C) et -o indique à gcc que nous voulons que notre exécutable soit appelé comme nous spécifions ensuite, comme dans l'exemple ci-dessus fichier de sortie. Pour exécuter notre création après la compilation, nous tapons simplement:
./fichier de sortie
Simple.
Lors de la compilation, le compilateur générera les erreurs, notifications et avertissements liés à la syntaxe de votre code. Les erreurs générées lors de la compilation sont appelées erreurs de "compilation", ce qui est souvent la partie la plus stressante de l’écriture d’une application (en particulier lorsque votre code ne compile pas car vous avez placé un seul caractère au mauvais endroit ou vous avez oublié de le faire. terminer une ligne par un point-virgule). La compilation peut également prendre du temps lorsque vous écrivez de grandes applications composées de plusieurs fichiers, ce qui est une autre raison pour laquelle la compilation peut être une expérience fastidieuse. Ce fait a conduit à une blague omniprésente de programmeur souvent vue sur les t-shirts d'hommes à la barbe négligée: "Je ne me relâche pas. Mon code est en cours de compilation."
Objective-C n’est pas si difficile à apprendre. Une fois que vous maîtriserez les principes de base, vous pourrez récupérer le reste plus facilement. Cependant, vous devez comprendre les bases de la programmation en C, et c’est ce que couvrira le reste de ce tutoriel..
Regardons une application de base en C:
#comprendreint main () printf ("Hello World \ n"); retourne 0;
Toute cette application fera en même temps que vous affichez la chaîne "Hello World" dans Terminal et quittez.
REMARQUE:
Vous êtes curieux de la déclaration "return 0"? Comme nous avons dit au compilateur que la fonction main () renverrait un entier, nous renvoyons la valeur entière constante «0» à la fin de la fonction. Par convention, renvoyer "0" au programme appelant indique que notre programme a été exécuté sans erreur..
Pour essayer cela par vous-même, lancez Xcode et créez une nouvelle classe Objective-C. Supprimez tout le code que Xcode vous donne par défaut et collez le code ci-dessus. Une fois que vous avez terminé, vous pouvez le compiler à l'aide de Terminal. Ouvrez Terminal et accédez à l'emplacement de votre fichier. Si vous enregistrez sur le bureau, tapez simplement cd desktop de sorte que Terminal lit maintenant à partir de votre bureau. Puis tapez cette commande:
gcc programme1.m -o programme1
Votre programme devrait compiler sans erreurs. Pour l'exécuter, tapez simplement:
./ programme1
Puis appuyez sur retour.
Génial, alors que s'est-il passé là-bas? Eh bien, d’abord, nous avons importé une bibliothèque appelée stdio qui gère les fonctions d’entrée / sortie standard, comme printf (). Nous créons ensuite une fonction appelée main qui doit renvoyer un entier ou entier, qui est essentiellement un nombre sans décimale. Nous utilisons ensuite la fonction printf () pour générer ʻHello World 'dans le terminal. Le \ n que nous utilisons indique au terminal de mettre une nouvelle ligne après le texte. Enfin, nous retournons 0 (rappelons que nous avons dit que main devrait renvoyer un entier), ce qui indique au système d'exploitation que tout s'est bien passé. Nous utilisons le nom main car celui-ci se déclenche automatiquement à l'exécution du programme.
Jusqu'à présent, tout devrait être assez simple: nous voulions écrire du texte dans Terminal. Nous avons donc importé une bibliothèque avec une fonction permettant d'écrire du texte, puis nous avons utilisé une fonction de cette bibliothèque pour écrire le texte. Imaginez que vous importiez une bibliothèque physique et que printf () soit l’un des livres disponibles..
En soldant, nous passons maintenant aux variables. L'une des tâches fondamentales que nous devons pouvoir effectuer dans nos applications consiste à stocker temporairement des données. Pour ce faire, nous utilisons des variables, qui sont des conteneurs pouvant contenir divers types de données et être manipulés de différentes manières. Nous utilisons des variables pour stocker toutes sortes de données, mais nous devons d’abord dire au compilateur ce que nous allons y stocker. Voici plusieurs des variables les plus importantes que vous devriez connaître pour le moment:
Lorsque nous n'utilisons pas de variables, nous utilisons souvent des constantes. Une constante ne changera jamais: nous savons toujours quelle sera la valeur. Si nous combinons des constantes, nous obtenons une expression constante, dont nous saurons toujours le résultat. Par exemple:
123 + 2 = 125
Ceci est une expression constante, 123 + 2 sera toujours égal à 125, quoi qu'il arrive. Si nous substituions une constante à une variable, la nouvelle expression ressemblerait à ceci:
123 + i = ?
Parce que i est une variable dynamique, nous ne connaissons pas le résultat de cette équation. Nous pouvons changer ce que nous voulons et obtenir un résultat différent. Cela devrait vous donner une idée du fonctionnement des variables.
Une chose que nous devons encore savoir, c'est comment afficher les variables telles que «Hello World» ci-dessus. Nous utilisons toujours la fonction printf (), sauf que ça change un peu cette fois:
#comprendreint main () int someNumber = 123; printf ("Mon numéro est% i \ n", someNumber); retourne 0;
Ce que nous avons fait ici dit à la fonction printf () où nous voulons que notre entier apparaisse, puis où il peut être trouvé. Ceci est différent de beaucoup de langages tels que PHP où vous pouvez simplement placer la variable dans le texte.
Nous ne sommes pas limités à une seule variable dans printf (). La fonction peut accepter plusieurs paramètres séparés par des virgules, nous pouvons donc en transmettre autant que nous avons de signes de formatage dans le texte. Ci-dessus, nous utilisons% i comme signe de mise en forme car nous incluions un entier. Les autres variables ont leurs propres spécificateurs de format:
Une chose que je veux aborder avant de poursuivre est le type de caractère. Une variable de type char ne peut gérer que des caractères uniques, c'est tout simplement super, mais si nous avons besoin d'une chaîne de texte, cela ne sert à rien. Pour résoudre ce problème, nous utilisons quelque chose appelé un tableau de caractères.
Imaginez que vous ayez une phrase de 11 caractères (comme "Bonjour le monde" - n'oubliez pas d'inclure l'espace), un tableau de caractères revient à avoir 11 caractères, mais ils sont tous collés. Cela signifie que la valeur du tableau de caractères est globalement ʻHello World 'mais char [0] est “H”. Entre parenthèses est le caractère que vous recherchez, car si nous mettons 0, nous obtenons le premier caractère. N'oubliez pas que compter dans des tableaux commence généralement par 0, pas 1.
Lorsqu'une application doit prendre une décision, nous utilisons un conditionnel. Sans condition, chaque fois que vous exécuterez votre application, ce serait exactement la même chose, comme si vous regardiez un film. En prenant des décisions basées sur des variables, des entrées ou quoi que ce soit d'autre, nous pouvons modifier l'application - ceci peut être aussi simple qu'un utilisateur qui entre un numéro de série ou appuie sur un bouton plus de 10 fois.
Il existe différents types de conditionnels, mais pour le moment, nous allons simplement nous pencher sur le plus commun et le plus fondamental: le si déclaration. Une instruction if fait ce que cela ressemble, elle vérifie si quelque chose est vrai, puis agit dans les deux sens. Par exemple:
#comprendreint main () if (1 == 1) // C'est toujours vrai // Faites des trucs ici return 0;
Si 1 est égal à 1, tout ce qui est entre les crochets est exécuté. Vous vous demandez peut-être aussi pourquoi nous avons utilisé deux signes d’égalité au lieu d’un seul. L'utilisation de deux signes égaux est un opérateur d'égalité, qui vérifie si les deux sont égaux. Si nous utilisons un seul signe égal, nous essayons d'assigner la première valeur à la deuxième valeur.
Ci-dessus, puisque 1 sera toujours identique à 1, tout ce qui est entre crochets sera exécuté. Et si nous voulions faire quelque chose si ce n'était pas vrai cependant? C'est là que autre intervient. En utilisant else, nous pouvons exécuter du code lorsque if conditionnel renvoie false, comme suit:
int main () if (1 == 1) // Faites des trucs ici. else // L'univers est cassé! retourne 0;
Bien sûr, dans la vraie vie, nous ne vérifions pas pour nous assurer que 1 est identique à 1, mais le point est clair. Considérez une application qui se ferme si vous appuyez trois fois sur le bouton de fermeture (ennuyeux mais pertinent). Vous pouvez vérifier entre parenthèses pour voir combien de fois il a été poussé. S'il est inférieur à 3, votre bloc else pourrait exécuter du code indiquant à l'utilisateur combien de fois le bouton doit être enfoncé pour quitter..
Nous examinerons davantage les conditionnelles lorsque nous les utiliserons dans nos applications plus loin dans la série.
Examinons maintenant une boucle de programmation. Les boucles, comme son nom l'indique, permettent de parcourir un morceau de code et de l'exécuter plusieurs fois. Cela peut être très utile dans des situations telles que le remplissage d'une liste ou la répétition d'un morceau de code jusqu'à ce qu'un conditionnel retourne true.
Il existe trois types de boucles, dans l'ordre des plus courants: pour, tandis que, et faire. Chacun est utilisé pour répéter l'exécution d'un bloc de code, mais ils fonctionnent différemment. Voici des exemples de chacun:
// if loop int main () int i = 9; int x = 0; pour (x = 0; x < i; x++) printf("Count is: %i\n", x); return 0;
Cela peut sembler un peu complexe au début, mais ce n’est vraiment pas le cas. Dans les parenthèses après for, vous trouverez l'initiateur, un conditionnel et l'action. Lorsque la boucle for commence, elle exécute l'initiateur, ce qui, dans notre cas ci-dessus, définit x sur 0. Chaque fois que la boucle s'exécute (y compris la toute première fois), elle vérifie la condition, qui est "x est-il inférieur à i?" Enfin, après chaque boucle dans le code, la boucle exécute l'action, qui incrémente ci-dessus x de un. Simple. Puisque x augmente de un à chaque fois, x ne sera bientôt plus inférieur à i et la boucle se terminera et le programme continuera à fonctionner.
// While loop int main () int x = 0; tandis que (x < 10) printf("Count is: %i\n", x); //Watch OUT! Something is missing. return 0;
Semblable à la boucle for, la boucle while exécute le code entre crochets jusqu'à ce que la condition soit fausse. Puisque x est 0 et que nous ne le changeons pas dans le bloc de code, la procédure ci-dessus serait exécutée indéfiniment, créant une "boucle infinie". Si vous souhaitez incrémenter x, alors, dans le cas de notre boucle while, vous le feriez entre crochets:
// While loop int main () int x = 0; tandis que (x < 10) x++; printf("Count is: %i\n", x); return 0;
La boucle do est essentiellement la boucle while, à l'exception des exécutions conditionnelles après le bloc de code. Cela signifie que lors de l'utilisation d'une boucle do, le code est garanti pour qu'il s'exécute au moins une fois:
// do loop int main () int x = 0; do x ++; printf ("Le nombre est:% i \ n", x); tandis que (x < 10); return 0;
Les pointeurs peuvent créer beaucoup de confusion avec les nouveaux venus dans la programmation ou simplement les nouveaux venus dans la catégorie C. Certaines personnes ne savent pas tout à fait en quoi elles sont utiles, mais vous apprendrez cela progressivement au fil du temps. Alors, quel est un pointeur?
Comme son nom l'indique, les pointeurs pointent vers un emplacement. Plus précisément, les emplacements dans la mémoire de l'ordinateur. Pensez-y comme ceci, lorsque nous créons une variable (disons que c'est un entier appelé ʻfoo 'comme il est si populaire en théorie de la programmation) et lui donnons une valeur de, par exemple 123, nous avons juste cela - une variable avec une valeur de 123. Maintenant, si nous configurons un pointeur sur foo, nous avons un moyen d'y accéder indirectement. C'est-à-dire que nous avons un pointeur de type int qui pointe vers foo et qui contient la valeur "123". Cela se ferait dans le code comme suit:
int toto = 123; // Ceci est une variable entière int * ptr = &foo; // Ceci est un pointeur sur une variable entière
Clair comme de la boue? Ne pas transpirer. Les pointeurs sont difficiles - souvent considérés comme la chose la plus difficile à apprendre lors de l’acquisition du langage C. Cependant, les pointeurs deviendront une seconde nature pour vous, et il y en aura plus sur les pointeurs dans Objective-C plus loin dans cette série.
Vous venez de recevoir un aperçu complet des bases du langage C. Cette partie de la série se voulait une introduction rapide à C pour vous préparer au reste de la série. Elle aurait dû être particulièrement utile pour ceux qui sont déjà familiarisés avec la programmation dans une autre langue. Si vous débutez dans la programmation en général ou si vous avez encore des doutes sur les bases du C, relisez ce qui précède et n'hésitez pas à laisser des questions dans les commentaires..
Avant la prochaine fois, veillez à essayer de compiler vos propres programmes en utilisant le code ci-dessus. Définissez-vous de petits défis, tels que faire exécuter une boucle 10 fois et compter chaque fois dans la boucle en utilisant printf. Il n'y a pas de mal à essayer et à expérimenter. Si tout se passe bien, c'est probablement encore mieux, car cela vous permettra de dépanner votre propre code..
Pour cette semaine, nous allons terminer sur un simple défi. Vous devez créer trois programmes qui comptent jusqu'à 10 en utilisant chaque type de boucle. Comme nous allons souvent utiliser des boucles dans Objective-C, il est bon que vous appreniez à les créer par cœur. Cela devrait être assez facile, alors essayez de décompter ensuite de 10 à 1 (si ++ incrémente de un, quel pourrait être le code pour décrémenter de 1?).
Dans le prochain épisode de cette série, je vais vous donner un aperçu du fonctionnement d’Objective-C. Nous examinerons également la programmation orientée objet et ses utilisations, ainsi que des recherches approfondies sur les classes, les instances, les méthodes, l'héritage, etc..
La semaine prochaine devrait vraiment vous aider à comprendre ce qui fait d’Objective-C un si bon langage et pourquoi il étend réellement le langage C de tant de façons utiles..
Si vous avez des questions, vous pouvez laisser un commentaire ci-dessous où je vais essayer de continuer à vérifier ou vous pouvez m'envoyer un message sur Twitter (http://www.twitter.com/iDemonix) où je reviendrai. vous dès que possible.