Руководство Swift для начинающих

1- Введение

This is guide of Swift for beginners. In order to program Swift you must install XCode programming tools. You can see the instructions to download and install at:
  • TODO Link!
Это инструкция для быстрого изучения, если вы только начинаете с Swift, способ инструкции это  "Шаг за шагом" поэтому вам нужно прочитать и выполнять сверху вниз по порядку, это статья поможет вам иметь общее понятие, перед тем как начать другие детальные статьи. 

2- Создайте ваш первый Project Swift

Это первое изображение, когда вы открываете  XCode
Создать новый Project:
Мы создали простой Project (Приложение Console, это приложение без интерфейса).
Назвать project SwiftBasics:
Создать папку на  Desktop чтобы сохранить ваши Project.
Назовите папку хранящую ваши project SwiftTutorials:
Ваш Project создан.
main.swift это исходный файл созданный при создании вашего project, вам нужно запустить этот исходный файл, он напишет на экране Console строку  "Hello, world".
Нажать  "Enable" чтобы разрешить программе работать в режиме для программиста.
Прогамма работает и печатает строку "Hello, world".

3- Объяснение основных характеристик Swift

Вам нужно иметь основное понятие  Swift, это очень важно.

Что такое Top level?

Команда или выражение не включенное в функции, блоке или классе, то есть находится в Top-Level.
Top-Level это место объявления использования библиотек, объявляения переменных, констант, функций, классов. По умолчанию переменные и константы объявляются на уровне Top-Level этого исходного файла, который может использоваться в других исходных файлах того же модуля (project).
Вы не можете написать выражение в Top-Level, например выражения вызова функции. Поэтому вызвать функцию  print("Hello") чтобы напечатать строку  "Hello" в  Top-Level не является действительным, только если вы сделаете это в исходном файле с названием main.swift (Это случай исключения).

Пункт начала в программе Swift:

В программе Swift файл  main.swift является особенным файлом, так как он является начальным пунктом для запуска программы. Вы можете вызвать функцию или написать выражение в Top-Level на исходном файле  main.swift, это исключение только для этого файла.
Я создаю новый исходный файл с названием newfile.swift, вы увидите оповещение ошибки когда я намеренно напишу выражение в  Top-Level.
Выражения должны быть расположены в функции или блоке.

4- Добавить новый исходный файл

Теперь вам нужно создать свой первый исходный файл и запустить его.
На  XCode, нажмите на правую кнопку мыши на папку содержащую исходный файл main.swift, выберите  "New file".
Ввести название файла  MyFirstSwift:
MyFirstSwift.swift создан:
Я изменю содержание только что созданного исходного файла, и добавлю функцию  sayHello(), примечание: более детально про функцию будет рассказано в другой части.
MyFirstSwift.swift
import Foundation

// Содержание приветствия.
var message = "Hello every body"

// Функция sayHello()
func sayHello()  {
    
    // Вызвать функция print для распечатки на экран Console.
    // Примечание: Вы не можете вызвать данную функцию у Top-Level.
    print(message)
    
}
В  Swift начальным пунктом для запуска приложения является  main.swift, поэтому чтобы протестировать функцию  sayHello() вам нужно вызвать в  main.swift. Изменить код main.swift:
main.swift
import Foundation


print("Hello, World!")

// Вызвать функцию sayHello()
// (Написано в MyFirstSwift.swift
sayHello()
Running project.

5- Виды данных в Swift

Type Typical Bit Width Typical Range
Int8 1byte -127 to 127
UInt8 1byte 0 to 255
Int32 4bytes -2147483648 to 2147483647
UInt32 4bytes 0 to 4294967295
Int64 8bytes -9223372036854775808 to 9223372036854775807
UInt64 8bytes 0 to 18446744073709551615
Float 4bytes 1.2E-38 to 3.4E+38 (~6 digits)
Double 8bytes 2.3E-308 to 1.7E+308 (~15 digits)

6- Переменные и объявление

Переменная определяется названием для области хранения данных где ваша программа может быть манипулирована. Каждая переменная в Swift имеет определенный вид данных, в котором определяется размер и рамки значения которые могут быть сохранены в памяти, и набор операторов применяющийся к переменной. 
Переменная может менять значение в процессе ее существования в программе. Переменные с фиксированным значением называются константами. Используйте ключевое слово let чтобы объявить переменную константой.
В swift, вы можете объявить переменную в  Top-Level или локальную переменную в класс или функции. С переменными объявленными в  Top-Level, они могут быть использованы в других исходных файлах в одном модуле (Project).
Объявить переменную:
// <Variable name>: Название переменной
// <Data Type>: Вид данных
var <Variable name> : <Data Type> ;

// Объявить переменную, и прикрепить значение ей.
// <Variable name>: Название переменной
// <Data Type>: Вид данных
// <value>: Значение
var <Variable name> : <Data Type> = <value>;

// Объявить костанту
// <Constant name>: Название константы.
// <Data Type>: Вид данных
// <value>: Значение
let <Constant name> : <Data Type> = <value>;

// Пример:
// Объявить переменную
// Название переменной: year
// Вид данных: Int
// Значение: 2016
var year: Int = 2016;

// С числом примитивного вида (primitive type) (Int, Double, Bool) и String,
// вы можете пропустить в объявлении.
// Swift может понять ваше намерение.
..

// Может означать как String
var languageName = "Swift"     
var version = 1.0  // Double
var introduced = 2014  // Int
var isAwesome = true   // Bool
VariableExample.swift
import Foundation

// Использовать ключевое слово 'let' для объявления константы (constant).
// Названием константы является COPYRIGHT, видом данных является String,
// и значением является "o7planning".
// (Это константа объявленная в Top-Level
// Может быть использована в других исходных файлах в project).
let COPYRIGH: String = "o7planning"

// Использовать ключевое словое 'var' для объявления переменной (variable).
// Название переменной: year
// Вид данных: Int
// Значение: 2016
// (Это переменная объявленная в Top-Level
// Может быть использована в других исходных файлах в project).
var year: Int = 2016



func variableExample()  {
    
    // Объявить константу целочисленного типа (integer)
    // Вы не можете прикрепить значение константе.
    let MAX_SCORE = 100;
    
    // Объявить целое число (integer).
    var score = 90;
    
    // Объявить строку (string).
    var studentName = "Tom"
    
    // Распечатать строку на экране Console.
    print("Hi \(studentName)")
    
    print("Your score: \(score)/\(MAX_SCORE)")
    
    print("Assign new value for studentName")
    
    // Прикрепить значение переменной studentName.
    studentName = "Jerry"
    print("Hi \(studentName)")
    
    
}
Изменить код исходного файла  main.swift:
main.swift
import Foundation

// Вызвать функцию variableExample(),
// определенную в файле VariableExample.swift
variableExample()
Результаты запуска примера:

7- Команды ветки

7.1- Команда If-else

if это команда проверки определенного условия в Swift. Например: Если a > b, то ....
Общие операторы сравнения:
Оператор Значение Пример
> Больше 5 > 4 правильно  (true)
< Меньше 4 < 5 правильно (true)
>= Больше или равно 4 >= 4 правильно  (true)
<= Меньше или равно 3 <= 4 правильно (true)
== Равно 1 == 1 правильно (true)
!= Неравно  1 != 2 правильно (true)
&& И  a > 4 && a < 10
|| Или  a == 1 || a == 4
// condition: Условие.
if ( condition )  {
    // Сделать что-то здесь.
}
Пример:
// Пример 1:
if ( 5 < 10 )   {
   print( "Five is now less than ten");
}

// Пример 2:
if ( true )   {
    print( "Do something here");
}
Полная структура  if - else if - else:
// Note that at most one block of code will be executed.
// The program checks the conditions from top to bottom.
// When a condition is true, this block will be executed.
// The remaining conditions will be ignored.
...

// If condition1 is true then ..
if (condition1 )  
{
     // Do something if condition1 is true.
}
// Else if condition2 is true then ....
else if(condition2 )  
{
    // Do something here if condition2 is true (condition1 is false).
}
// Else if conditionN is true then ...
else if(conditionN )  
{
     // Do something if conditionN is true 
     // (All the above conditions are false)
}
// Else (All the above conditions are false).
else  {
     //  Do something.
}
IfElseExample.swift
import Foundation


func  ifElseExample()  {
    
    // Объявить переменную вида UInt32 со случайным значением.
    // (Функция arc4random() возвращает случайное значение).
    var randomValue: UInt32 = arc4random()
    
    print("Random value = " + String(randomValue))
    
    // Разделить на 200 и вернуть остаток (remainder).
    var age: UInt32 = randomValue % 200;
    
    print("Your age= " + String(age))
    
    // Проверить если age < 80 thì..
    if (age < 80)    {
        print("You are pretty young");
    }
    

    else if  age >= 80 && age <= 100     {
        print("You are old");
    }
    
    // Наоборот (Остальные случаиi).
    else    {
        print("You are verry old");
    }
    
    
}
Запуск примера:

7.2- Команда Switch-Case

Некоторые примеры использования  switch:
SwitchExample1.swift
import Foundation

func switchExample1()   {
    
    // Предложить пользователю вариант выбора.
    print("Please select one option:")
    
    print("1 - Play a game")
    print("2 - Play music")
    print("3 - Shutdown computer")
    print("---------------------")
    

    var randomValue: UInt32 = arc4random()
    
    // Разделить на 5 и вернуть остаток (remainder) (0, 1, 2, 3, 4)
    var myValue:UInt32 = randomValue%5
    
    // Объявить переменную 'option'.
    // Cast вид UInt32 в вид Int.
    // 'option' будет иметь значение 1, 2, 3, 4 или 5.
    var option:Int = Int(myValue) + 1
    
    // String(option): cast в String.
    print("You select: " + String(option))
    
    // Проверить значения 'option'.
    switch (option)   {
        
    case 1:
        print("You choose to play the game");
    case 2:
        print("You choose to play the music");
    case 3:
        print("You choose to shutdown the computer");
    // Остальные случаи.
    default:
        print("Nothing to do...");
    }
    
    
}
Запуск примера:
Вы можете использовать много значений в одном случае (case):
SwitchExample2.swift
import Foundation


func switchExample2() {
    
    // Объявить переменную и прикрепить к ней значение 3.
    var option = 3
    
    print("Option = \(option) ")
    
    // Проверить значение 'option'.
    switch (option)    {
        
    case 1:
        print("Case 1")
    
    // В случае, значением является 2,3,4,5
    case 2, 3, 4, 5:
        print("Case 2,3,4,5!!!")
   
    // В случае значение от 6 -> 10
    case 6...10:
        print("Case 6...10")
    
    // В случае значение от 11 -> 20 и является нечетным.
    case 11...20 where option % 2 == 1:
        print("Case 11...20 and odd")
        
    default:
        print("Nothing to do...")
        
    }
    
    
    
}
Запуск примера:

Fallthrought:

Если вы работаете с другим языком как Java, C#, вы можете увидеть что синтакс использования switch отличается от  Swift. В  Swift при правильном случае (case), блок команд данного случая (case) будет выполнен, и другие случаи не будут запущены.

С  Java, C# если случай правильный, блок команды того случая будет запущен, и если отсутствует команда break то следующий блок команды case (или  default) будет выполнен.

Swift был автоматически  break после завершения выполнения блока команды  case.
Swift добавляет команду  fallthrought (Данная команда отсутствует в  Java, C#), fallthrought говорит программе продолжить выполнение следующего блока команды  case (или блок команды  default).
Посмотрим изображенный пример:
SwitchFallthroughExample.swift
import Foundation

func switchFallthroughExample()  {
    
    
    var option = 15
    
    switch (option)   {
        
        
    case 0...10:
        print("Case 0...10")
        // fallthrough: Выполнить следующий случай.
        fallthrough
        
    case 11...20:
        print("Case 11...20")
        // fallthrough: Выполнить следующий случай.
        fallthrough
        
    case 21...30:
        print("Case 21...30")
        // fallthrough: Выполнить следующий случай.
        fallthrough
        
    case 31...40:
        print("Case 31...40")
        
    case 41...50:
        print("Case 41...50")
        
    default:
        print("Default case")
    }
    
}
Запуск примера:

8- Цикл в Swift

Цикл используется для повторного запуска блока команды. Он заставляет вашу программу повторно выполнять блок команды много раз, это один из основных задач в программировании 
Swift поддерживает 4 разных вида циклов:
  • FOR .. IN
  • FOR
  • WHILE
  • REPEAT WHILE

8.1- Цикл for in

Цикл  for .. in используется для просмотра на наборе, или массиве.
Синтаксис:
// <element>: Элемент
// <collection>: Коллекция
for <element> in <collection> {
       // Сделать что-то здесь
}
Пример ниже использует  for .. in для просмотра на массиве (Понятие массива будет упомянуто в следующей части).
ForInExample1.swift
import Foundation


func forInExample1()  {
    
    // Объявить массив с String с 5 элементами.
    var languages:[String] = ["Java","C#", "C/C++", "Swift", "Ruby"]
    
    
    for lang in languages  {
        
        print("Language " + lang)
    }
    
}
Запуск примера:

8.2- Цикл for

Структура цикла FOR:

for (initialize variable ; condition ; updates new value for variable )
{
        // Execute the block when the condition is true
}
Пример:
// Example 1:
// Declare a variable x and assign value 0.
// The condition is x < 5
// If x < 5 is true then execute the block.
// After each iteration, the value of x is increased by 1.
for (int  x = 0;  x < 5 ; x = x + 1)
{
    // Do something here when x < 5 is true.
}


// Example 2:
// Declare variable x and assgin value of 2
// The condition is x < 15
// If x < 15 is true then execute the block.
// After each iteration, the value of x is increased by 3.
for (int  x = 2;  x < 15 ; x = x + 3)
{
    // Do something here when x < 15 is true.
}
ForLoopExample.swift
import Foundation


func forLoopExample()   {
    
    print("For loop example");
    
    // Объявить переменную x и прикрепить к ней значение 2.
    // Условием является x < 15
    // Если x < 15 верно (true) то выполнить блок команды.
    // После каждого повтора (iteration), значение x увеличивается на 3.
    for (var x = 2; x < 15; x = x + 3)    {
        print( );
        print("Value of x = \(x)");
    }
    
}
Результаты запуска примера:

8.3- Цикл while

Синтаксис:
// condition: Условие
while (condition)  
{
     // Когда 'condition' верно, то выполнить блок команды.
}
Пример:
// Объявить переменную x.
int x = 2;

while ( x < 10)
{
    // Сделать что-то здесь если x < 10 еще верно.
    ...
    	
    // Обновить новое значение переменной x.
    x = x + 3;
}
WhileLoopExample.swift
import Foundation

func whileLoopExample()   {
    
    print("While loop example");
    
    // Объявить переменную и прикрепить к ней значение 2.
    var x = 2;
    
    // Условием является x < 10
    // Если x < 10 верно (true), то выполнить блок команды.
    while (x < 10)  {
        
        print("Value of x = \(x)");
        
        x = x + 3;
    }
    
}
Результат запуска примера:

8.4- Цикл repeat-while

Синтаксис цикла REPEAT-WHILE
// Особенностью цикла 'repeat-while' является выполнение блока конманд минимум 1 раз.
// После каждого запуска блока команд, он проверяет условия, чтобы знать выполнять ли дальше.
repeat   {

    // Сделать что-то здесь
    // Потом проверить дальше условие, решить продолжать ли запуск данного блока команд или нет.
} while (condition)
RepeatWhileExample.swift
import Foundation

func repeatWhileExample()    {
    
    print("Repeat-While loop example")
    
    // Объявить переменную и прикрепить к ней значение 2.
    var x = 2
    
    // Выполнить блок команд минимум один раз.
    // После каждого раза выполнения блока команд,
    // он проверит условие,
    // если условие все еще верно, то блок команд выполняется дальше.
    repeat    {
        print("Value of x = \(x)")
        
        x = x + 3;
        
    } while (x < 10)
    
}
Результаты запуска примера:

8.5- Команда break в цикле

break это команда которая может находиться в блоке команд цикла. Это команда завершения цикла беспричинно.
LoopBreakExample.swift
import Foundation


func loopBreakExample()    {
    
    print("Break example");
    
    // Объявить переменную и прикрепить к ней значение 2.
    var x = 2;
    
    while (x < 15)     {
        
        print("----------------------");
        print("x = \(x)");
        
        // Если x = 5, то выйти из цикла.
        if (x == 5)  {
            break;
        }
        // Увеличить значение x на 1.
        x = x + 1;
        print("After +1, x = \(x)");
        
    }
    
}
Результат запуска примера:

8.6- Команда continue в цикле

continue это команда, которая может находиться в цикле, при встрече с командой continue, программа пропустит команды в блоке ниже  continue и начнет новый цикл.
LoopContinueExample.swift
import Foundation

func loopContinueExample()  {
    
    print("Continue example")
    
    // Объявить переменную и прикрепить к ней значение 2.
    var x = 2
    
    while (x < 7) {
        
        print("----------------------")
        print("x = \(x)")
        
        // Оператор % является делением с остатком.
        // Если x является четным, то пропустить строки команд внизу 'continue'
        // и начать следующее повторение (Если условие все еще верно).
        if (x % 2 == 0)  {
            // Увеличить значение x на 1
            x = x + 1
            continue
        }
        else {
            // Увеличить значение x на 1
            x = x + 1
        }
        print("After +1, x = \(x)")
        
    }
}
Результаты запуска примера:

9- Массив в Swift

9.1- Одномерный массив

Массив в  Swift на самом деле является  Struct, он отличается с массивом в других языках как Java, C#,...Массив  Java, C# имеет фиксированное количество элементов и не может добавить или убавить количество элементов, при этом массив в Swift может это сделать.
Это изображение одномерного массива 5 элементами, которые индексированы от 0 до 4.
Синтаксис объявления одномерного массива:
// Способ 1:
// Объявить массив чисел Int, и определить элементы.
var years: [Int] = [ 2001, 2003, 2005, 1980, 2003 ];

// Или (Swift понимает это как массив чисел Int).
var years = [ 2001, 2003, 2005, 1980, 2003 ];



// Способ 2:
// Объявить массив чисел Float.
// 3 элемента, и все элементы имеют значение 0.
var salaries:[Float] = [Float](count: 3,repeatedValue :0 );

// Или:
var salaries  = [Float](count: 3,repeatedValue :0 );

// Способ 3:
// Объявить пустой массив (Не имеет элемента).
var emptyArray:[Int] = [Int]()
Например:
ArrayExample1.swift
import Foundation

func arrayExample1()  {
    
    // Способ 1:
    // Объявить массив чисел Int, определить элементы.
    var years: [Int] = [ 2001, 2003, 2005, 1980, 2003 ];
    
    print("--- years --- ");
    
    // count является property массива, он возвращает количество элементов массива.
    print("Element count of array years = \(years.count)");
    
    // Использовать цикл для for чтобы распечатать элементы массива.
    for (var i = 0; i < years.count; i = i + 1) {
        print("Element at \(i) =  \(years[i])");
    }
    
    print("--- salaries --- ");
    
    // Способ 2:
    // Объявить массив чисел Float.
    // 3 элемента, все элементы имеют значение 0.
    var salaries:[Float] = [Float](count: 3,repeatedValue :0 );
    
    // Прикрепить значения элементам.
    salaries[0] = 1000;
    salaries[1] = 1200;
    salaries[2] = 1100;
    
    // Использовать цикл для for чтобы распечатать элементы массива.
    for (var i = 0; i < salaries.count; i = i + 1) {
        print("Element at \(i) =  \(salaries[i])");
    }
    
    
}
Результаты запуска примера:

Массив в Swift это Struct

В  Swift, массив в действительности является  Struct (Структура) поэтому он имеет атрибуты и методы. Включая методы добавления элементов в массив или удаление элементов.
// Объявить массив String, с 2 элементами.
var languages = ["Java","C#"]

// Использовать метод append() чтобы соединить 1 элемент в конец массива.
languages.append("Swift")

// Можно так же использовать оператор += для соединения массива в конец текущего массива.
languages += ["C/C++", "Perl"];
Пример:
ExpaddingArrayExample.swift
import Foundation


func expaddingArrayExample()  {
    
    // Объявить массив String,  с 2 элементами.
    var languages = ["Java","C#"]
    
    // Использовать метод append() чтобы соединить 1 элемент в конец массива.
    languages.append("Swift")
    
    // Можно так же использовать оператор += для соединения другого массива в конец.
    languages += ["C/C++", "Perl"];
    
    // Использовать цикл for-in.
    for lang in languages {
        
        print("Language: " + lang)
    }
    
}
Запуск примера:

enumerate

Метод  enumerate() массива возвращает объект EnumerateSequence struct. Каждый элемент  EnumerateSequence включает информацию индекса, и элементы начального массива.
Смотрите больше про struct по ссылке:
Пример просмотра элементов массива:
EnumerateArrayExample.swift
import Foundation
import Cocoa

func enumerateArrayExample()  {
    
    // Объявить массив String с 3 элементами.
    var languages :[String] = ["Java", "C#", "Swift"]
    
    
    
    for  (index, element )  in languages.enumerate()  {
        
        print("Element at \(index) = \(element)");
    }
    
}
Запуск примера: