O introducere în Swift Partea 1

La WWDC 2014, Apple a introdus una dintre cele mai mari actualizări pentru iOS din 2008, din punctul de vedere al dezvoltatorului. Ei au introdus HomeKit, HealthKit, CloudKit și Extensions, doar pentru a numi câteva. Dar cea mai mare surpriză din WWDC 2014 a fost introducerea unui nou limbaj de programare, Swift.

Swift este un limbaj minunat de programare care a fost construit de la bază pentru a fi eficient și sigur. Utilizează aceleași API-uri pe care obiectivul-C le face. Sau, ce puteți face în Obiectiv-C, puteți face în Swift. Acesta introduce, de asemenea, unele concepte noi pe care programatorii de mult timp le vor aprecia și unele dintre ele le voi acoperi în această serie introductivă despre Swift.

În această serie, o să presupun că deja cunoașteți obiectivul C. În primul articol al acestei serii, vorbesc despre filozofia lui Swift, structura fișierelor și sintaxa. În cel de-al doilea articol, măresc dimensiunile mai avansate ale sintaxei Swift, cum ar fi opțiunile și gestionarea memoriei. Stai la pălăriile tale, oameni buni, va fi o doozy.

1. Filosofia

Pentru a înțelege mai bine Swift, Apple ne condiționează cu îmbunătățiri structurale în obiectivul C în ultimii ani. Obiective-C imbunatatiri cum ar fi blocuri de cod, literal matrice și definiții de dicționar, și ARC (Automate de numărare de referință) sunt doar câteva lucruri Apple a adăugat la obiectivul-C care facilitează tranziția la Swift.

Un pilon important al filozofiei lui Swift este inițierea codului. Toate obiectele și variabilele, atunci când sunt definite în Swift, trebuie inițializate în cod. Un obiect sau o variabilă neinitializat va avea ca rezultat o eroare de compilare a timpului în Swift. Acest lucru asigură că un obiect sau o variabilă are întotdeauna o valoare. Există un caz special în Swift pentru că nu poate fi definită o valoare inițială. În acest caz special, variabila dvs. este numită a facultativ. Vom acoperi opțiunile în a doua parte a acestei serii.

Un alt pilon important este completitudinea sucursalei. Toate ramurile condiționate, fie ele dacă sau comutator / caz, trebuie să acopere toate condițiile. În acest fel, niciun cod nu poate cădea fără a fi acoperit. Lipsa unei condiții în declarația dvs. de sucursală va fi prinsă și va genera o eroare de compilare a timpului.

Un ultim element al filosofiei lui Swift este preferința sa față de constante față de variabile. Swift definește variabilele și constantele în felul următor:

lasă uneleConstant: String = "Aceasta este o constantă" var someVariable: String = "Aceasta este o variabilă"

În exemplul de mai sus, lăsa cuvântul cheie este folosit pentru a defini o constantă în timp ce var cuvântul cheie definește o variabilă. Prin stabilirea definiției constantelor acest lucru ușor, Apple încurajează utilizarea constantelor ori de câte ori este posibil. Acest lucru conduce la un cod mai sigur într-un mediu multithreaded și o optimizare a codului mai bună, deoarece compilatorul știe că valoarea unei constante nu se va schimba.

Acum, există mult mai multe pentru Swift decât câteva îmbunătățiri de sintaxă și formatare. Swift a fost construit de la sol, pentru a repara numeroase surse de accidente C / C ++ obisnuite, inerente obiectivului C. Aspecte precum:

  • indiciile excluse din matrice
  • date neinitializate
  • tipurile de întoarcere neconfirmate
  • acces necontrolat la pointer
  • implicit cădea 
  • greseli de eroare

Ca cineva care programează atât pentru iOS cât și pentru Android, știu cât de multă distracție de codare pentru platforma iOS este cu Cocoa și UIKit. Această serie vă va arăta cât de mult mai multa distractie codarea poate fi prin adăugarea lui Swift la mix.

2. Structura fișierelor

În obiectivul C, avem antet fișiere (.h) și punerea în aplicare fișiere (.m). Acesta este un obiectiv Obiectiv C moștenit din limba C.

În Swift, o clasă este definită într-un singur fișier de implementare (.rapid) care include toate definițiile și implementările clasei. Acest lucru amintește de alte limbi precum Java și C #.

A dispărut este nevoia de jonglarea fișierelor antet și adăugarea de plictisitor #IFNDEF în partea de sus a fișierelor antet.

3. Sintaxă

Primul lucru pe care îl veți observa despre Swift este dispariția punctului vestic de la sfârșitul fiecărei instrucțiuni. În Swift, fiecare linie este considerată o declarație și nu o facem trebuie să adăugați un punct și virgulă la sfârșitul fiecărei linii.

Subliniez trebuie să, pentru că nu te oprește să adaugi punct și virgulă la sfârșitul declarațiilor tale. Voi continua să adaug punct și virgulă la sfârșitul fiecărei instrucțiuni, deoarece cred că crește lizibilitatea. De asemenea, este foarte dificil să scapi de obiceiul de a adăuga punct și virgulă ca dezvoltatorii de cacao de ani de zile.

O altă schimbare importantă a lui Swift este că ele sunt obligatorii dacă declarații. Asta inseamna ca nu mai sunt bug-uri Heartbleed.

Sintaxa poate fi un subiect complex pe care să-l scrieți. Swift are o mulțime de subtilități care pot dura foarte mult pentru a trece peste, dar acest lucru nu este scopul acestui articol. Pentru scurtcircuit, mă voi concentra asupra schimbărilor pe care un dezvoltator Obiectiv-C le va observa.

4. Asemănări cu Obiectivul-C

Voi începe să vă arăt trei fragmente de cod care ilustrează unele dintre asemănările cu Obiectiv-C. Vă va ajuta să înțelegeți limbajul Swift.

// Obiectiv-C pentru (index int = 0; index < 5; i++)  NSLog(@"%d",index);  // Swift for index in 1… <5  plrintln("\(index)"); 
// Comutator obiectiv-C (index) caz 0: pauză; cazul 1: spargere; prestabilit: pauză;  // comutator swift (index) caz 0: caz 1: implicit: // nu există o declarație de pauză
// Obiectiv-C dacă (index == 0)  // Swift dacă index == 0  // parantezele sunt opționale // sunt necesare bretele curbate

Programatorii Obiectiv-C vor găsi că Swift are aceleași declarații de ramură și iterație pe care deja le cunoașteți, cum ar fi dacă / altceva,  pentru bucle, pentru ... in buclele și intrerupator declaraţii.

Swift include doi operatori de gamă, ... < și ... , pentru a specifica o serie de valori. În cele de mai sus pentru buclă, vom folosi operatorul de interval semi-închis, ... <, pentru a specifica o gamă de valori care include 1, 2, 3 și 4, dar exclude 5. Celălalt operator este domeniul operatorul cu interval închis, ... . Specifică o gamă de valori care include valoarea pe ambele părți ale operatorului de domeniu închis. De exemplu, 1 ... 5. specifică o gamă de valori de la 1 la 5, inclusiv 5.

5. Definirea variabilelor și a constantelor

Să revedem exemplul pe care vi l-am arătat mai devreme.

let someConstant: String = "Aceasta este o constantă"; var someVariable: String = "Aceasta este o variabilă";

În Swift, definim constantele folosind lăsa cuvântul cheie și variabilele utilizând var cuvinte cheie. Colonul, : ,este un marker pentru a defini tipurile. În exemplul de mai sus, creăm o constantă și o variabilă de tip Şir.

De asemenea, inițializăm constanta și variabila cu un șir. În Swift, șirurile sunt definite exact ca șiruri C în Obiectiv-C, ele nu sunt precedate de un an @ simbol.

Obiectivul C este un limbaj puternic tipizat, ceea ce înseamnă că trebuie să fie întotdeauna specificat tipul unei variabile sau al unui parametru. Swift este, de asemenea, un limbaj puternic introdus, dar Swift este puțin mai inteligent, deoarece compilatorul va deduce un tip de variabilă. De asemenea, compilatorul se asigură că nu se produce o distribuție incorectă a variabilelor fără cunoașterea și intervenția exprimată.

Dacă rescriem exemplul de mai sus, care face ca lucrarea să funcționeze, fragmentul de cod arată după cum urmează:

let someConstant = "Aceasta este o constantă"; var someVariable = "Aceasta este o variabilă"; lăsați unInt = 1; lasa someFloat = 1.0;

Acest lucru este mult mai bun și codul este mult mai curat. Compilatorul este suficient de inteligent pentru a înțelege acest lucru someInt este un Int și someFloat este a Dubla.

6. Corzi

O modalitate de a obține o idee despre puterea unei limbi este explorarea modului în care se ocupă de manipularea șirului. Obiectivul C are multe funcții și caracteristici care ne permit să ne ocupăm de șiruri de caractere, mai bune decât cele mai multe limbi, dar au tendința de a fi verbose și confuze din când în când.

Să începem cu un exemplu de Obiectiv-C. Pentru a concatena două șiruri în Obiectiv-C, facem următoarele:

NSString * string = @ "Bună ziua"; NSString * salut = [string stringByAppendingString: @ "Lumea!"];

În Swift, pentru a adăuga un șir la un alt șir, folosim + operator. Este atat de simplu.

lasă string = "Bună ziua" să salute = șir + "Lumea!"

String-urile din Swift sunt Unicode, ceea ce înseamnă că putem scrie:

lasă string = "你好 世界"

Putem repeta caracterele unui șir folosind a pentru ... in precum este prezentat în exemplul următor. Putem folosi a pentru ... in pentru a itera iruri de caractere Unicode. Este într-adevăr atât de cool.

lasa str = "Bună ziua"; pentru char în str println (char);  // ieșiri // H // e // l // l // o

Un ultim lucru pe care aș vrea să-l acoperim despre șiruri de caractere înainte de a merge mai departe este interpolarea șirului. În Obiectiv-C, dacă vrem să emităm un șir cu variabile, invocăm [NSString stringWithFormat:]. În Swift, variabilele pot fi încorporate. Uitați-vă la următorul exemplu.

x = 4; permite y = 5; println ("\ (x) x \ (y) = \ (x * y)") // ieșiri // 4 x 5 = 20

Pentru a utiliza interpolarea șirului, înfășurați apelul de variabilă sau funcție în paranteze și puneți o lunetă înapoi în față, \ (expresie).

7. Arrays & Dictionaries

mulțime & Dicţionar

Ca programator Obiectiv-C, deja cunoașteți matrice și dicționare. Swift are, de asemenea, clase de colectare și adaugă câteva caracteristici suplimentare acestora.

Cum folosiți colecțiile în Swift? În Swift, sunt chemați mulțime și Dicţionar. Declararea unei matrice în Swift este similară cu declararea unui matrice literal în Obiectiv-C, folosind un set de paranteze pătrate, [], dar fără un @ simbol precedent.

lasa someArray: [String] = ["unul", "doi", "trei"]; var someOtherArray: [String] = ["alfa", "beta", "gamma"];

Același lucru este valabil și pentru dicționare. Cu toate acestea, în loc să utilizați bretele curbate, utilizați paranteze pătrate.

lasa cevaDictionary: [String: Int] = ["unul": 1, "doi": 2, "trei": 3]; var someOtherDictionary: [String: Int] = ["pisici": 1, "câini": 4, "șoareci": 3];

Mutabilitate

Daca un mulțime obiect este echivalent cu un NSArray obiect și a Dicţionar obiect este echivalent cu un NSDictionary obiect, atunci cum putem crea matrice și dictionare mutabile în Swift?

Răspunsul este foarte simplu, declarând obiectul drept o variabilă. Cu alte cuvinte, în exemplul anterior someArray este echivalentul unui NSArray exemplu și someOtherArray cea a unui NSMutableArray instanță. Acest lucru se aplică și dicționarilor. În exemplul anterior, someDictionary este echivalentul unui NSDictionary exemplu și someOtherDictionary cea a unui NSMutableDictionary instanță. Asta e curat, corect?

În timp ce matricele și dicționarele Obiectiv-C pot conține numai obiecte, în Swift, colecțiile pot conține atât obiecte, cât și tipuri de date primitive, cum ar fi numere întregi și flotoare. O altă diferență importantă cu obiectivul C este aceea că colecțiile din Swift sunt tipărite, în mod explicit sau prin inferență de tip la momentul compilării. Prin specificarea tipului de obiecte dintr-o colecție, Swift adaugă o siguranță suplimentară acestor colecții.

Deși putem să omitem tipul unei variabile atunci când o declarăm, nu schimbă faptul că compilatorul va atribui tipuri obiectelor într-o colecție. Utilizarea inferenței de tip ajută la păstrarea codului lizibil și luminos.

Putem redecla mulțime și Dicţionar obiecte pe care le-am declarat mai devreme după cum urmează:

lasa someArray = ["unul", "doi", "trei"]; var someOtherArray = ["alfa", "beta", "gamma"]; lăsați someDictionary = ["unul": 1, "două": 2, "trei": 3]; var someOtherDictionary = ["pisici": 1, "câini": 4, "șoareci": 3];

Compilatorul va inspecta colecțiile în timpul inițializării și va deduce tipul corect. Cu alte cuvinte, înțelege asta someArray și someOtherArray sunt o colecție de Şir obiecte și someDictionary și someOtherDictionary sunt dicționare cu chei de tip Şir și valorile tipului Int.

Manipularea colecțiilor

Adăugarea unui obiect sau a altui matrice la o matrice este foarte asemănătoare cu concatenarea șirului în care folosim și + operator.

var array = ["unul", "doi", "trei"]; // matricea array mutable + = "patru"; // adăugați element la array de matrice + = ["cinci", "șase"]; // adăugați matrice la matrice

Manipularea dicționarelor este la fel de ușor.

var dicționar = ["pisică": 2, "câine": 4, "șarpe": 8]; // dicționar dictionar mutable ["leu"] = 7; // adăugați element în dicționarul dicționar + = ["urs": 1, "mouse": 6]; // adăugați dicționarul în dicționar

Colecții tipizate

Mai devreme, am menționat că colecțiile din Swift sunt tipărite, dar ce înseamnă asta? Dacă definim o colecție care conține Şir obiecte, puteți adăuga numai Şir obiecte pentru acea colecție. Dacă nu faceți acest lucru, va apărea o eroare.

Să examinăm un exemplu pentru a clarifica acest lucru. Definim o colecție de Mașină obiecte. Următorul fragment de cod afișează Mașină clasă și o matrice mutabilă autoturisme, conținând trei Mașină instanțe.

// Clasa de clasa auto Masina var speed = 0.0 func accelerate (by: Double = 1.0) -> Bool viteza + = by; return true;  var cars = [Car (), Mașină (), Mașină ()]; 

În spatele scenei, compilatorul va deduce tipul matricei. Dacă vrem să adăugăm un nou Mașină exemplu la colecție, putem folosi pur și simplu + operator, după cum se arată mai jos.

mașini + = Mașină ();

Cu toate acestea, adăugarea unui obiect de alt tip va duce la o eroare.

mașini + = "Unele șir"; // aceasta va cauza o eroare de compilator

Acest lucru are avantajul suplimentar al siguranței de tip pentru preluarea obiectelor din colecții. De asemenea, elimină necesitatea de a arunca obiecte de colectare înainte de a le folosi.

În exemplul nostru, a Mașină obiect are un accelera metodă. Deoarece o colecție este tipărită, putem să luăm un element din matrice și să invocăm imediat o metodă pe obiect, într-o singură linie de cod. Nu trebuie să ne facem griji cu privire la tipul elementului, deoarece colecția conține numai Mașină obiecte.

autoturisme [0]. accelera (cu: 2.0);

Pentru a realiza același lucru în Obiectiv-C cu același nivel de siguranță, va trebui să scriem următoarele:

id pointer = mașini [0]; dacă ([pointerul este KindOfClass: [clasa mașinii]]) Car * car = (Car *) pointer; [accelerați mașina: 2.0]; 

În cele din urmă, pentru a repeta o matrice, folosim a pentru ... in buclă:

pentru mașină în mașină car.accelerate (de: 2.0); 

Pentru a repeta un dicționar, folosim și a pentru ... in buclă:

pentru (cheie, valoare) în uneleDictionary println ("Cheia \ (cheie) are valoarea \ (valoare)"

După cum puteți vedea, colecțiile tipizate reprezintă o caracteristică puternică a limbajului Swift.

Concluzie

 Am învățat deja destul de mult despre limbajul Swift și ar trebui să vă faceți timp să vă lăsați să se scufunde. Vă recomandăm să descărcați Xcode 6 cât mai curând posibil și să începeți să aplicați ceea ce ați învățat în acest articol în noul Xcode Loc de joaca caracteristică. Locurile de joacă vă permit să jucați cu Swift în timp real.

Asta e pentru acest articol. În următoarea tranșă a acestei serii, ne uităm la tuple, funcții, închideri, clase și, nu în ultimul rând, opțiuni. De asemenea, veți afla cum funcționează gestionarea memoriei în Swift. Rămâneți aproape.

Cod