Pentru a obține ceva de făcut în Swift, trebuie să înveți elementele de intrare și ieșire din funcții. Funcțiile sunt extrem de puternice și flexibile în Swift. Elementele de bază sunt simple, mai ales dacă ați mai lucrat cu alte limbi de programare înainte. Dar din cauza sintaxei flexibile a lui Swift, funcțiile pot deveni confuze dacă nu sunteți familiarizați cu elementele de bază.
În acest articol, ne concentrăm mai întâi pe elementele de bază. Apoi vom continua să explorăm sintaxa mai complexă și cazurile de utilizare în următorul articol. Este important să nu schimbați elementele de bază, deoarece acestea sunt esențiale pentru a înțelege de unde provine puterea unei funcții. Să începem prin disecarea anatomiei unei funcții în Swift cu un exemplu.
O funcție nu este altceva decât un bloc de cod care poate fi executat ori de câte ori este necesar. Să aruncăm o privire asupra unui exemplu de anatomie de bază a unei funcții Swift. Activați Xcode și creați un nou loc de joacă. Adăugați următoarea definiție a funcției la locul de joacă.
func printHelloWorld () print ("Hello World!")
O funcție începe cu FUNC
și este urmată de numele funcției, printHelloWorld
în exemplul nostru. Ca în multe alte limbi, numele funcției este urmat de o pereche de paranteze care conțin parametrii funcției - intrarea în funcție.
Corpul funcției este înfășurat într-o pereche de bretele curbate. printHelloWorld ()
funcția conține o singură instrucțiune care imprimă șirul Salut Lume!
la ieșirea standard. Aceasta arata o functie de baza in Swift. Sintaxa este simplă, curată și minimalistă.
Puteți invoca funcția introducând numele funcției, urmată de o pereche de paranteze.
printHelloWorld ()
Să facem exemplul de mai sus un pic mai complex prin adăugarea de parametri la definiția funcției. Acest lucru înseamnă pur și simplu că oferim funcția cu valori de intrare pe care le poate utiliza în corpul funcției. În exemplul următor, definim printMessage (Mesaj :)
care acceptă un parametru, mesaj
, de tip Şir
.
func printMessage (mesaj: String) print (mesaj)
O funcție poate accepta mai mulți parametri sau valori de intrare. Parametrii sunt înfășurați de parantezele care urmează numele funcției. Numele parametrului este urmat de un colon și de tipul parametrului. După cum vă amintiți, aceasta este foarte asemănătoare cu declararea unei variabile sau a unei constante. Pur și simplu spune că mesaj
este parametrul de tip Şir
.
În loc să tipărim un șir de coduri grele așa cum am făcut-o în printHelloWorld ()
funcția, imprimați mesaj
parametru. Aceasta face ca funcția să fie flexibilă și mai utilă.
Invocarea funcției este foarte asemănătoare cu ceea ce am văzut mai devreme. Singura diferență este că noi introducem un argument când invocăm funcția.
printMessage (mesaj: "Hello World!")
Rețineți că termenii parametrii și argumente sunt adesea folosite interschimbabil, dar există o diferență subtilă, semantică în Swift. În Swift, parametrii sunt valorile specificate în definiția funcției, în timp ce argumentele sunt valorile transmise funcției atunci când este invocată.
Așa cum am menționat mai devreme, sintaxa funcțiilor este foarte flexibilă și nu trebuie să vă surprindă că este perfect posibil să transmiteți mai multe argumente unei funcții. În exemplul următor, vom crea o variantă pe printMessage (mesaj: ori :)
funcție care ne permite să imprimam mesajul de mai multe ori.
func printMessage (mesaj: String, Times: Int) pentru i în 0 ...În timp ce numele funcției este identic cu cel al originalului
printMessage (Mesaj :)
funcția, tipul funcției este diferit.Este important să înțelegeți propoziția anterioară. Citiți-o din nou.
Fiecare funcție are un tip, constând din tipurile de parametru și tipul de returnare. Vom explora tipurile de întoarcere într-un moment. Funcțiile pot avea același nume, atâta timp cât tipul lor este diferit, după cum arată ultimele două definiții ale funcțiilor.
Tipul primei funcții este
(String) -> ()
, în timp ce tipul celei de-a doua funcții este(String, Int) -> ()
. Numele ambelor funcții este același. Nu vă faceți griji cu privire la->
simbol. Sensul său va deveni clar în câteva momente când vom discuta tipurile de întoarcere.Al doilea
printMessage (mesaj: ori :)
funcție definește doi parametri,mesaj
de tipŞir
șiori
de tipInt
. Această definiție ilustrează una din trăsăturile pe care Swift le-a adoptat de la obiectivele C, funcțiile și metodele care pot fi citite. În timp ce numele funcției esteprintMessage
, este ușor de înțeles ce înseamnă funcția prin citirea numelor parametrilor funcției.In secunda
printMessage (mesaj: ori :)
funcția, vom crea opentru
-în
buclă pentru a imprimamesaj
şirori
ori. Folosim operatorul pentru intervalul semi-deschis,... <
, după cum am văzut mai devreme în această serie.Când începem să tipăm
printMessage
în spațiul de joacă, Xcode afișează ambele funcții în meniul de completare automată. Datorită tipului funcției, este ușor să alegeți funcția de care suntem interesați. Apelați al doileaprintMessage (mesaj: ori :)
funcția este la fel de simplă:printMessage (mesaj: "Hello World", ori: 3)Valori implicite
Una dintre caracteristicile mele favorite este abilitatea de a defini valorile implicite pentru parametri. Acest lucru poate părea proastă dacă veniți dintr-o limbă care a avut această caracteristică de-a lungul vremurilor, dar acest lucru este destul de mare dacă ați lucrat cu C și Obiectiv-C de mai mulți ani.
Pe scurt, Swift permite dezvoltatorilor să definească valori implicite pentru parametrii unei funcții. Să definim o nouă funcție care imprimă data curentă într-un anumit format. Asigurați-vă că adăugați următoarea instrucțiune de import în partea de sus a locului de joacă pentru a importa cadrul UIKit.
import UIKitSă definim mai întâi
printDate (data: Format :)
funcția fără a utiliza valorile implicite pentru oricare dintre parametri.func printDate (data: data, formatul: String) let dateFormatter = dataFormatter () dateFormatter.dateFormat = format print (dateFormatter.string (de la: date)Dacă nu sunteți familiarizat cu cadrul fundației și nu înțelegeți ce se întâmplă în corpul funcției, atunci este bine. Accentul acestui exemplu nu se referă la implementarea formatării unei date. În
printDate (data: Format :)
, folosim valoarea luiformat
parametru pentru a formata valoareaData
. Dacă nu vom trece o valoare pentruformat
parametru, compilatorul aruncă o eroare.Putem remedia acest lucru prin definirea unei valori implicite pentru al doilea parametru al funcției, așa cum se arată în definiția actualizată a funcției de mai jos.
func printDate (data: data, format: String = "YY / MM / dd")) dateFormatter = DateFormatter () dateFormatter.dateFormat = format print (dateFormatter.stringDefinirea unei valori implicite este la fel de simplă ca specificarea unei valori în lista parametrilor din definiția funcției. Rezultatul este că compilatorul nu se mai plânge și eroarea dispare.
printDate (data: data ())Chiar dacă am specificat o valoare implicită pentru
format
parametru, putem totuși să trecem printr-o valoare dacă vrem.printDate (data: data (), format: "dd / MM / YY")Rețineți că Apple recomandă parametrii de poziționare cu o valoare implicită la sfârșitul listei parametrilor. Aceasta este cu siguranță o idee bună și comună în cele mai multe limbi de programare care suportă parametrii opționali.
3. Return Type
Funcțiile pe care le-am văzut până acum nu ne înapoiază nimic când le invocăm. Să facem asta
printDate (data: Format :)
funcția este mai utilă returnând data formatată ca șir, în loc să imprimați data formatată în corpul funcției. Acest lucru necesită două modificări, după cum puteți vedea mai jos.func printDate (data: data, formatul: String = "YY / MM / dd") -> String let dateFormatter = DateFormatter () dateFormatter.dateFormat = format data returnareFormatter.stringPrimul lucru pe care îl schimbăm este definiția funcției. După lista parametrilor, specificăm tipul returului,
Şir
. Tipul de returnare este precedat de->
simbol. Dacă ați lucrat cu CoffeeScript, atunci acest lucru va arăta familiar.În loc să imprimați data formatată utilizând
Print (_: separator: terminator :)
funcția, vom folosiîntoarcere
pentru a returna valoarea din funcție. Asta e tot ce trebuie să facem. Să încercăm.permiteți formattedDate = printDate (data: data (), format: "dd / MM / YY") print (formattedDate)Invocăm
printDate (data: Format :)
funcția, stocați valoarea returnată în constanțăformattedDate
, și tipăriți valoareaformattedDate
în ieșirea standard. Rețineți că numeleprintDate (data: Format :)
funcția nu mai reflectă ceea ce face, deci vă recomandăm să o schimbațiformatDate
in schimb.Nici un tip de retur
Celelalte funcții pe care le-am definit în acest tutorial nu au avut un tip de returnare. Atunci când o funcție nu are un tip de retur, nu este necesar să includeți
->
simbol în definiția funcției.Câteva paragrafe mai devreme, v-am spus că nici una dintre funcțiile pe care le-am definit ne-a adus o valoare. De fapt, nu este chiar adevărat. Permiteți-mi să vă explic detaliile cu un detaliu experimental. Adăugați următoarea linie la locul de joacă și vedeți ce se întâmplă.
Acest lucru este interesant. Swift nu are o problemă în care stocăm valoarea returnată a
printHelloWorld ()
funcționează într-o constantă, dar ne avertizează că tipul de valoare returnată nu este ceea ce am putea crede că este.Ce se intampla aici? Fiecare funcție din Swift returnează o valoare, chiar dacă nu definim un tip de retur în definiția funcției. Atunci când o funcție nu specifică în mod explicit un tip de retur, funcția se întoarce implicit
neavenit
, care este echivalentă cu o nucă goală sau()
pe scurt. Puteți vedea acest lucru în panoul de ieșire al locului de joacă și este menționat, de asemenea, în avertismentul ieșirilor compilatorului.Putem să scăpăm de avertismentul de mai sus prin declararea explicită a tipului de avertisment
valoare
, o nucă goală. Sunt de acord că nu este foarte util să stocați o tupă goală într-o constantă, dar vă arată că fiecare funcție are o valoare returnată.lași valoarea: () = printHelloWorld ()Perechile
O altă caracteristică importantă a lui Swift este abilitatea de a returna mai multe valori dintr-o funcție prin returnarea unei tuple. Următorul exemplu ilustrează modul în care funcționează acest lucru. Permiteți-mi să repet că nu este important să înțelegeți cum
timeComponentsForDate (data :)
funcționează. Focalizarea este valoarea returnată a funcției, o trupă cu trei elemente.func timeComponentsForDate (_ date: Date) -> (ora: int, minut: int, a doua: Int) let dateComponents = Calendar.current.dateComponents ([. = dateComponents.hour lasa minute = dateComponents.minute let second = dataComponents.second return (ora 0, minutul 0, secunda? 0)Funcția acceptă un argument, a
Data
instanță și returnează o tuplă cu trei valori etichetate. Etichetarea valorilor tuplei este doar pentru comoditate; este posibil să omiteți etichetele.func timeComponentsForDate (_ date: Date) -> (Int, Int, Int) let dateComponents = Calendar.current.dateComponents ([oră, .minute, .second], from: date) hour hour = dateComponents.hour let minute = dateComponents.minute a doua secunda = dataComponents.second return (ora 0, minutul 0, a doua? 0)Cu toate acestea, după cum ilustrează exemplul următor, etichetarea valorilor tuplei returnate din funcție este foarte convenabilă și face codul mai ușor de înțeles.
lăsați timeComponents = timeComponentsForDate (Date ()) print (timeComponents.hour) print (timeComponents.minute) print (timeComponents.second)De asemenea, este posibil să returnați o valoare opțională dintr-o funcție dacă există scenarii în care funcția nu are nicio valoare pentru a reveni. Acest lucru este la fel de simplu ca definirea tipului de returnare a funcției ca opțional, după cum se arată mai jos.
func timeComponentsForDate (_ date: Date) -> (ora: Int, minut: Int, a doua: Int)? dateComponents = Calendar.current.dateComponents ([. ora, .minute, .second], de la: data) paza la ora ora = dataComponents.hour altceva return nil paza let minute = dateComponents.minute altceva return nil let second = dateComponents.second else returnați zero return (ora, minutul, a doua)Concluzie
În acest tutorial, am explorat elementele de bază ale funcțiilor Swift. Este important să înțelegeți sintaxa funcțiilor, pentru că în următorul articol vom explora funcții mai avansate care se bazează pe ceea ce acoperim în acest tutorial.
Vă încurajez să citiți din nou articolul dacă este necesar și, mai important, să scrieți câteva funcții într-un loc de joacă pentru a vă familiariza cu sintaxa. Elementele de bază sunt ușor de înțeles, dar veți avea parte de ele doar prin practicare.
Dacă doriți să aflați cum să utilizați aplicația Swift 3 pentru a codifica aplicațiile din lumea reală, consultați cursul nostru Creați aplicații iOS cu Swift 3. Indiferent dacă sunteți nou în dezvoltarea de aplicații iOS sau căutați să treceți de la obiectivul C, curs va începe cu Swift pentru dezvoltarea de aplicații.