Тук ще се запознаем с историята на Swift
. Ще се научим къде и как можем да пишем нашите първи програми. Ще надникнем във вселената на open-source (проектите с отворен код). Ще се запознаем с github и различните среди за разработка.
Преди да се гмурнем в детайли от къде идва Swift
е добре да се запознаем с различните езици, които са популярни в момента.
В днешно време има много езици за програмиране. Някои от тях имат доста дълга история, други са по-млади, но не така популярни.
Следващата статистика ни подсказва тенденциите в програмирането през последните няколко години.
|Language|| |————:|——-| |JavaScript|71.5%| |HTML|69.4%| |CSS|66.2%| |SQL|58.5%| |Java|45.4%| |Bash/Shell|40.4%| |Python|37.9%| |C#|35.3%| |PHP|31.4%| |C++|24.6%| |C|22.1%| |TypeScript|18.3%| |Ruby|10.3%| |Swift|8.3%| |Objective-C|7.3%| |Go|7.2%| |Assembly|6.9%| |VB.NET|6.9%| |R|6.0%| |Matlab|5.5%| |VBA|4.8%| |Kotlin|4.7%| |Groovy|4.5%| |Scala|4.5%| |Perl|4.2%| – Статистиката е взета от анкетата на StackOverFlow за 2018 година. Отговори са дали 73,248 запитани.
Всички програмни езици различна история. Можете да разгледате кога са създадени те тук.
Ясно се вижда, че Swift
изпреварва доста езици като популярност.
Новите езици са близки до старите, но не еднакви. Те вземат добрите им страни. Издигат нови ценности и стават популярни, като правят работата на разработчиците лесна. Крайният резултат е по-добър, процесът по-разработване е по-лесен, кодът е по-стабилен. Някои нови езици позволяват изграждането на сложни системи с лекота и за по-кратко време.
Swift
Въпреки че Swift
е само на няколко години (през 2014г. е представен пред публика), вече има пета версия (Swift 5), а от трета е с отворен код. (Трета версия е първата основна след публикуването на swift
като open-source език.) Първоначално, Apple наемат Chris Lattner, който е основният автор на [LLVM] (https://en.wikipedia.org/wiki/LLVM), да развие системите за разработка на софтуер в компанията. Така, Apple постепенно преминава към LLVM, т.е. LLVM е интегриран в инструментите за разработка на приложения за macOS и iOS. На кратко - LLVM измества GNU Compiler Collection (GCC) (най-популярения по това време компилатор) и се налага като стандарт, успявайки същевременно да направи прехода от GCC към LLVM плавен и безболезнен.
Първа версия на езика (Swift 1.0) е публично достъпна на 9 септември 2014г. Официално версия 1.1 е пусната на 22 октомври 2014г. Трета версия, представена на 13 септември 2016г., след който момент се замислихме за стартиране на подходящ курс по програмиране във ФМИ. В този курс ще разгледаме версия 5, която беше пусната на 25 март 2019г.
През януари 2017 Chris Lattner, считан за създател на Swift, прехвърля водещата роля на Ted Kremenek, но обещава да следи развитието на езика.
Какво е приложение с отворен код (Open-source)? Не трябва да бъркаме “свободно приложение” (free ware) с “приложение с отворен код” (Open-source), въпреки че има припокриване. Приложенията с отворен код може да са платени, може и да са безплатни. Всичко това се определя от лиценза, под който се разпространява програмният код, съпътстващ приложенито. Характерно за софтуера с отворен код (СОК) е, че може да се разгледа самият програмен код, който го изгражда.
Отвореният код като термин се налага след 1998г., като има различни инициативи в негова подкрепа. Тази идеология се възприема и сред най-големите софтуерни компании на пазара, които постепенно обикват модела и започват да го прилагат. Повече информация за цялостното движение в подкрепа на отворениея код можем да намерим тук.
Важно е да отбележим, че отвореният код осигурява и гаранира високи нива на:
Повече за отворения код можем да намерим във есето от 1997г. - “Катедралата и базарът” на Ерик Реймънд, където той публично дискутира двата различни подхода при разработка на софтуер - класическия затворен модел и отворения модел.
Нека сега да приложим наученото към Swift и да се опитаме да посочим позитивните страни на езика, след като е възприел идеологията на отворения код. Ще представим позитивните страни в списък, като същите не са подредени по важност:
Всички горни точки гарантират, че Swift ще го има докато има общество, което да го поддържа. На базата на темповете, с които се развива, можем да сме сигурни, че езикът ще продължава да расте и да “краде” от дяла на другите програмни езици.
Github е едно от най-популярните места за публикуване и съхранение на отворен код в момента. Това, че даден проект е публикуван в Github не означава, че той автоматично става достъпен безплатно. Хората имат достъп до кода, но нямат правото да го ползват, освен ако това не е изрично уредено с лиценз. Лицензът, под който се разпространява даден код, определя начинът, по който може да се използва в други проекти. Например, ако даден проект е под лиценз GPL, той не може пряко да участва в друг комерсиален продукт, защото GPL-лицензът задължава всеки, който използва части от този код, да разпространява напълно безплатно продукта. Преди да качите Вашия проект, помислете какъв лиценз би пасвал най-добре. Когато ползвате чужди проекти, първо трябва да съобразите лицензите им. Лицензи, които са благоприятни за ползване, са Apache, MIT, BSD, разновидности на Creative commons.
Можете да намерите всичко свързано със swift
във github на следния адрес https://github.com/apple/swift.
Swift 3.0 е първата голяма версия (3), която е опънсорс.
Версия 5 (Swift 5) е официално пусната на 25 март 2019. Няма синтактични разлики в езика от версия 4. Ще разгледаме част от нововъведенията в хода на курса. Повече информация какво е добавено със версия 5 може да намерите тук.
Swift
?Swift е платформено независим език, но официално няма версия за Windows. Такава обаче съществува на следния адрес: Swift for Windows
Първо трябва да инсталирате специален пакет, който може да свалите от следния сайт.
След успешното инсталиране може да използвате произволни редактори на код (със съответните разширения за swift
) за да пишете вашите програми.
Не е нужно да имате Mac компютър за да може да пишете програми на Swift
!
Това е стандартната среда за разработване от Apple, която можете да свалите от Appstore. Безплатна е, но върви само на macOS
.
Това е допълнителна програма за лесно разработване на swift програми, било то мобилни или не. За съжаление, няма пълно препокриване със Xcode поради липсата на InterfaceBuilder частта. За съжаление и тя е само за macOS
. Средата е базирана на така популярние IntellyJ
, но не е безплатна. Има безплатна версия, до която може да получите достъп, ако сте студенти.
Атом е доста популярен редактор на код. Той е платформено независим и е с отворен код. Има много разширения, които позволяват да го превърнете в пълнофункционално IDE.
VSCode е популярен редактор на код разработен от Microsoft. Той е платформено независим и е с отворен код. Има много разширения, които позволяват да го превърнете в пълнофункционално IDE. Има и разширения, които ни дават възможност да пишем ѕwift
. Не трябва да го бъркате със стандартната версия на Visual Studio.
Следват инструкции как да настроите вашата среда за програмиране. Преди това трябва да сте инталирали:
Това е популярното IDE разработено от Microsoft за писане на
Положението не е много по-различно със стандартното IDE за програмиране предоставено от Microsoft. От скоро има и версия за macOS
.
Swift Playgrounds e мобилно приложение за iPad и мак компютри, което ни учи как да боравим с прогмания език Swift
. Това предоставя доста по интерактивен и привлекателен начин да се учим на чрез приложение от Apple. Връзки за сваляне на приложението, демо и друга полезна информация можете да намерите на официалната страница на Swift Playgrounds.
А сега е време да вникнем в основите на Swift
.
Сега ще се запознаем с основните структурни единици на езика. Ще дискутираме различните видове и ще дадем примери за тяхната употреба.
Swift
ни позволява да свързваме място в паметта (оперативната такава) с определени данни (стойност/и). Едно и също мястото в паметта може да има различни имена или казано по друг начин - различни имена могат да сочат едно и също място в паметта.
Има два начина за такова свързване: константно и променливо.
Ето един примерен програмен код, за да онагледим гореизложеното:
let oneValue = 1
var integerValue = 42
В примера по-горе константно свързваме мястото в паметта, което място е с име: “oneValue”, със следните данни: стойността 1. Аналогично, променливо свързваме мястото в паметта, което място е с име: “integerValue”, със следните данни: стойността 42.
Нека, метафорично, да си представим че паметта на компютъра представлява огромен скрин с твърде много чекмеджета. При изпълнението на нашата програма, някой се грижи да ни казва кои чекмеджета може да ползваме, а след краят на програмата, ще мине и ще почисти всичко ненужно останало в тях. Всяко чекмедже може да съдържа нещо, т.е. то си има тип предмети, които може да съхранява. Тук намесваме, константното свързване (let) - това е, чекмедже, на което даваме име и в което можем да поставим нещо само веднъж и то винаги ще съдържа единствено и само това нещо. Няма да можем да го заменим. От друга страна, променливото свързване (var) - това е чекмедже, на което даваме име и което може да ползваме напълно нормално. Т.е. можем да му сменяме съдържанието в произволен момент, да заменяме предмета/тите в чекмеджето. Хубавото, е че когато искаме да боравим с чекмеджетата можем да използваме техните имена (имената на променливите или константите.)
Swift
позволява да декларираме по няколко проемнливи на един ред.
Пример:
var x = 0, y = 5
let a = 1, b = 3
Как да именуваме променливите?
Променливите трябва да имат описателни имена. Не е добре да ги съкращаваме излишно. Кодът трябва да е само описателен и да няма нужда от излишни коментари, ако сложността му го позволява.
Ето какво трябва да избягваме, когато програмираме.
let a = "hello"
let b = "world"
let r = "\(a) \(b)!"
И към какво да се стремим.
let greeting = "hello"
let subject = "world"
let result = "\(greeting) \(subject)!"
Добра практика
Когато променлива няма да бъде променяна във Вашия код, добре е да я заменяте с константа, използвайки запазената дума let
.
Коментарите са част от програмния код, който създаваме, но се игнорират от Swift-компилатора. Накратко, те нямат влияние върху финалната програма. Тяхната роля е да поставят пояснителни бележки в процеса на писане на програмния код. Има два вида коментари:
Коментари на един ред. Същите започват с две наклонени черти //
и всичко до края на реда се счита за коментар;
Коментари на много редове. Те започват с /*
и завършват с */
.
Ето един пример за коментар:
//декларираме константата 0
let zeroValue = 0
/*а това е коментар на
няколко
реда*/
Swift предоставя версия на основните типове данни: Int, Double, Float, Bool, String. Всеки от основните типове данни разполага с подвариации в зависимост от платформата, за която е компилирана съответната програма .
Например: на 32-bit-ова платформа Int е същият размер като Int32. На 64-bit-ова платформа, Int е същият размер като Int64.
Понеже Swift е силно типизиран език (strongly typed), това означава, че всяка променлива или константа трябва да има тип данни. Тук може да навлезем в детайли за сигурността на езика по време на компилация, но предлагаме на любопитния читател да потърси сам повече информация за видовете програмни езици и за тяхната сигурност относно типовете - type safety. Това е една обширна тема, по която няма единно мнение, кои езици са по-добри - силно или слабо типизираните, но има ясно очертани граници. Ясно е, че дискутирайки Swift, става въпроз за случая, в който компилаторът ще ни помага преди да изпълним нашата програма.
Характерът и природата на Swift не позволяват смесването на типове данни без експлицитното му обявяване (конвертиране от тип в тип).
Въпрос: Как да обявим, че дадена променлива/константа е от определен тип (т.е. че тя ще съдържа данни от съответния обявен тип)?
Всяка променлива или константа може да има изрично зададен тип. Това става чрез обявяване на типа след името на променливата. Ето и примерен код:
var sum: Int
На компютърен език двоеточието означава: “от тип”, т.е. можем да прочетем горния код като: декларираме променлива с име “sum” от тип цяло число (__Int__eger).
Добра практика
В практиката много рядко се пишат типове данни. Ако имаме начална стойност на променливите, Swift може да определи типа на променливата или константата автоматично.
Нека първо да се запознаем с целите числа (Integers). Ето и няколко примера: 42, 0, -1.
Целите числа се делят на два основни подтипа в Swift: такива със знак (signed) и такива без знак (unsigned) Тези със знак са: позитивни, нулата и негативните, а тези без знак са само позитивните и нулата. Всички типове цели числа в Swift започват с големи букви. Ето и няколко примера: Int, Int32, UInt8, UInt32, UInt64. Езикът ни предоставя достъп до минималната и максималната стойност на целочисления тип. Например:
UInt8.min // минимална стойност
UInt64.max // максимална стойност
Дробните числа в езика за програмиране са представени с два основни типа данни - Float и Double. Първият тип (Float) използва по-малко памет, но дава възможност за по-малко точност при представянето на дробното число в паметта. Защо? Накратко - съхранява по-малко цифри след десетичната точка. Когато декларираме променлива или константа и присвоим дробно число, типът, който Swift определя за тази променлива, е Double. Той се характеризира с по-голяма точност и в тази връзка, когато извършваме операции, като делене, можем да покажем повече цифри след десетичния разделител (десетичната запетая).
Подобно на типовете цели числа, съществуват различни типове дробни числа в зависимост от операционната система, на която ще стартираме програмата. Имаме два типа данни, които представят дробни числа в паметта на компютъра: Float32 и Float6, като Float32 е Float, а Float64 е Dоuble. Double типът няма различни варианти, за разлика от целочислените типове.
Това е тип данни, които съхранява в паметта на компютъра последователност от текст. Интересно е представянето на символните низове в паметта поради наличието на различни естествени говорими и писмени езици. За да може боравим с различни езици, още в началото авторите на езика са заложили възможността му да работи с Unicode. За да въведем концепцията за различни писмени езици, ще си мислим, че Uni–code е таблица, която определя на кой код (число) кой символ да бъде изобразен. Нарича се Unicode, защото съдържа кодовете на различни писмени езици като Българския, Арабския, Китайския и т.н. Кратък поглед в историята на компютрите показва, че преди Unicode да се наложи е било необходимо всеки компютър да зарежда своя таблица с кодове, но това води до проблеми. Може да прочетете много за ASCII и произлизащите проблеми от тази кодова таблица/стандарт. Проблеми, с които сме се сблъсквали и ние - понякога не можем да видим какво е написано, най-често когато искаме да гледаме филм с български субтитри. Често това се случва поради грешна употреба на кодовата таблица при превръщане на числата(кодовете) в символи.
Примерно:
let codeOfA = ("A" as Unicode.Scalar).value
//(стойността на символа __А__)
let codeOfB = codeOfA + 1
// тези каствания (прехвърляния през различните типове са необходими, за да можем да отпечатаме буква по зададен код (номер)
print(Unicode.Scalar(codeOfB)!)
Всеки един символен низ, съхранява конкретен набор от UTF символи и на базата на това, коя версия на UTF използва, дължината на символния низ в паметта е различна. Ето няколко примера, които подчертават това и дискутират последствията от това.
Примерно:
let helloWorld = "Hello 🌍!"
// синтаксиса ?? се оценява, с дясната стойност на израза, само ако първата част е nil. За повече информация виж частта за Optionals
//utf-8
print(Unicode.Scalar(helloWorld.utf8.dropFirst(0).first!))//H
print(helloWorld.utf8.dropFirst(6).first!)//част от емоджито
print(helloWorld.utf8.dropFirst(7).first!)//част от емоджито
print(helloWorld.utf8.dropFirst(8).first!)//част от емоджито
print(helloWorld.utf8.dropFirst(9).first!)//част от емоджито
print(Unicode.Scalar(helloWorld.utf8.dropFirst(10).first!)) //!
//utf-16
print(helloWorld.utf16.dropFirst(6).first!)
print(helloWorld.utf16.dropFirst(7).first!)
print(helloWorld.utf16.dropFirst(8))//!
//utf-32
print(helloWorld.unicodeScalars.dropFirst(6).first!)//емоджи
print(helloWorld.unicodeScalars.dropFirst(7))//!
Трябва да отбележим една специфика на езика, че тук Символният низ се предава по стойност във функции. Това може да ви звучи странно, но когато се сблъскаме със функции, ще направим разлика с другите езици, където се предава по референция (примерно C++). За да можем да използваме символните низове и да представяме цифрова информация, е добре да можем да знаем как да инициализираме символен низ (string) използвайки променливи от други типове.
let realNumber = String(12.35)
let integerNumber = String(3 + 4)
В хода на нашата програма всяка променлива може да има стойност или да няма такава. Какво ще рече, да няма стойност? Това е специално състояние, което показва, че променливата няма стойност (или по скоро има запазената стойност nil). Това въвежда неудобстовото, всеки път да се проверява дали дадена променлива има стойност и ако има такава да се преминава към действие, ако няма да се действа по друг начин. За да се улесни боравенето със това специално състояние на липса на стойност във Swift са въведени опционалните типове. Те са като стандартните типове, но завършват с ?. Да, точно така, завършват с ? за да ни подскачат визуално, че има възможност дадена променлива да няма стойност.
Примерно:
let a: Int? = 5
Основното правило за работа с опционален тип е, че трябва да стигнете до стойността му. Затова е въведена let конструкцията и с нейна помощ, може много лесно и четимо да боравите със стойностите на променливи.
Сега ще разгледаме, каква е структурата на такъв опционален тип. Той има две състояния - да има стойност или да няма стойност (nil) Тук е добре да се прави разлика от nil в Objective-C.
Когато срещаме Int? ние виждаме краткият запис за Optional
let numberOne: Int? = Optional.some(1) // има стойснот 1
let nothing: Int? = Optional.none // няма стойност
! За операторите ще говорим в детайли следващите лекции.
##Съвети:
Ако имате въпроси, може да ги задавате по e-mail - swiftfmi [at] gmail.com.
Хубаво е да споделяте идеи с колегите си относно решенията на някакви задачи, но не и самите решения. Университетът има за цел, да изгради начин на мислене, което става със споделянето на идеи, а не на цели решения.
Тези, които познават Objective-C или Swift и искат да завършат курса, трябва да покажат добро владеене на езика. Това може да стане с разработката на проект, който е по-тежък и изисква повече усилия или по стандартният начин, като преминат стъпка по стъпка през курса. Моля разгледайте началната страница на курса, където ще нъдат обявени и проектите.