Swift это новый язык программирования от компаний Apple, который она презентовала в 2014 году на WWDC.

Вместе с языком программирования, Apple выпустила отличный справочник по языку Swift, который я рекомендую прочитать или ознакомиться с ним. Так же в сети есть русская версия этой книги

Тем не менее, прочитать справочник это очень долго! Так что если у Вас нет много времени и Вы просто хотите узнать о новом языке Swift, то эта статья для Вас.

Это учебное руководство займет приблизительно 15 минут и проведет Вам быструю экскурсию по языку Swift, мы с Вами рассмотрим такие понятия как переменные, классы, методы наиболее успешной практики, и многое другое.

Вы даже сделаете удобный калькулятор расчета чаевых!

Для этого руководства по Swift Вам понадобится последняя версия Xcode (минимум Xcode 6 так же подойдет Xcode 7 ). Вам не нужно обладать никаким предварительным опытом написания приложений на Swift или Objective-C, но если у Вас есть некоторый опыт программирования, то это будет огромных плюсом! Начнем!

Знакомство с Playground

Запустите Xcode 6 и перейдите в меню File\New\File. Выберите iOS\Source\Playground, и нажмите Next.

Назовите файл SwiftTutorial.playground, а затем нажмите Next и сохраните файл где-нибудь на компьютере. Удалите все из своего файла, таким образом, Вы начнете с чистого листа.

Примечание: После создания playground, Вы можете получить ошибку, которая говорит “Error running playground: Failed to prepare for communication with playground”. Если это произойдет, просто закройте Xcode и запустите его заново, и эта ошибка должна исчезнуть.

Playground представляет собой новый тип файла, который позволяет проверить Swift-код и увидеть результаты каждой строки кода на боковой панели, что дает нам понять, что это интерпретируемый язык. Например, добавьте следующие строки кода в Ваш Playground:

let tutorialTeam = 56
let editorialTeam = 23
let totalTeam = tutorialTeam + editorialTeam

В процессе ввода этих строк, Вы увидите результат каждой строки на боковой панели.

Playground является отличным способом, чтобы узнать о языке Swift, экспериментировать с новыми API, для прототипирования кода и алгоритмов, или визуализировать код. В остальной части этого учебника по языку Swift, Вы будете работать с этим playground.

Примечание: на этом этапе я также рекомендую Вам перетащить файл playground (SwiftTutorial.playground) на Ваш OS X Dock

Таким образом, Вы можете использовать этот файл в качестве блокнота когда Вы захотите проверить Swift-код.

Переменные vs. константы в Swift

Попробуйте добавить следующую строку кода в свой playground:

totalTeam += 1

Когда вы добавите эту строку кода, Вы заметите ошибку. Это происходит потому, что totalTeam является константой, т.е. ее значение не может изменяться. С чего следует, что константы создаются с помощью ключевого слова let.

Если Вы хотите, чтобы переменная tutorialTeam была изменяемой, Вы должны объявить ее с ключевым словом: var.

Замените строку кода, с помощью которой инициализируете переменную totalTeam на следующую:

var totalTeam = tutorialTeam + editorialTeam

Теперь все работает! Вы наверное думаете : “почему бы просто не объявлять все переменные как var, так как это менее строго?”:

Объявляйте переменные как let всякий раз, когда это возможно, это является наилучшей практикой, потому что это позволит компилятору выполнять оптимизацию. Так что помните: предпочитайте объявлять переменные как let!

Explicit vs. Inferred Typing

До сих пор Вы явно не задавали тип для констант и переменных, поскольку компилятор имел достаточно информации, чтобы сделать это за Вас автоматически.

Например, Вы установили tutorialTeam в 56, компилятор знает что число 56 : Int, это автоматически задаст тип для tutorialTeam как Int.

Однако, Вы можете явно установить тип, если хотите. Попробуйте установить явно тип, заменив строку кода, которая устанавливает tutorialTeam:

let tutorialTeam: Int = 56

Вы можете задаться вопросом, должны ли Вы явно установлять типы или позволить компилятору присваевать типы за Вас. Мы полагаем, что это - лучшая практика, чтобы позволить компилятору присвоить типы автоматически, если это возможно, потому что тогда Вы получаете одно из главных преимуществ языка Swift: краткий и легко читаемый код.

По этому, верните строку назад к первоначальному виду:

let tutorialTeam = 56

Типы и условные операторы в Swift

До сих пор Вы видели пример для переменных типа Int, который является базовым типом языка Swift, и который используется для целочисленных значений, но есть много других типов.

Floats and Doubles

let priceInferred = 19.99
let priceExplicit: Double = 19.99

Существует два типа для десятичных значений, такие как: Float и Double. Double имеет большую точность, и является значением по умолчанию для устанавливания десятичных значений. Это означает, что priceInferred тоже является Double.

Bools

let onSaleInferred = true
let onSaleExplicit: Bool = false

Обратите внимание, что в языке Swift используются значения true/false для значений типа boolean (в отличие от конвенции YES/NO в Objective-C).

Strings

let nameInferred = "Whoopie Cushion"
let nameExplicit: String = "Whoopie Cushion"

Строки, как и следовало ожидать, создаются также, за исключением того, что Вы больше не используете знак "@", как использовали в Objective-C, что может быть по началу не привычным :]

If и строка интерполяции

if onSaleInferred {
  println("\(nameInferred) on sale for \(priceInferred)!")
} else {
  println("\(nameInferred) at regular price: \(priceInferred)!")
}

Этот пример, использования оператора if, как Вы могли бы ожидать на разных языках. Скобки вокруг условия не являются обязательными, и скобки не нужны даже для отчетности 1-строки. w00t!

Этот пример также показывает использование новой технологии, вызова интерполяции. Всякий раз, когда Вы хотите заменить что-то в виде строки в языке Swift, просто используйте следующий синтаксис: \ (ваш выражение).

На данный момент, Вы не можете увидеть, где отображается результат выполнения данного кода Println. Чтобы увидеть, где отобразился Println, Вам нужно открыть консоль для вывода, это можно сделать с помощью Assistant Editor в меню View\Assistant Editor\Show Assistant Editor.

Классы и методы

Одина из самых распространенных задач, которую Вы будете реализовывать при разработке на языке Swift, это создание классов и методов, так что давайте познакомимся с этим!

Во-первых, удалите все, что Вы написали до этого в своем playground, что бы опять начать с чистого листа.

Далее Вам нужно создать класс tip calculator, который поможет Вам подсчитать, сколько следует давать чаевых в ресторане. Вы будете добавлять код небольшими блоками, с объяснениями каждого шага при разработке этого класса.

// 1
class TipCalculator {
}

Чтобы создать класс, просто напишите ключевое слово class и задайте имя для нового класса. Затем добавить две фигурные скобки для написания тела класса.

Если класс является подклассом другого класса, нужно поставить двоеточие и затем имя суперкласса. Обратите внимание, что Вам не обязательно создавать свой класс на основе подкласса, Вы просто ничего не пишете (в отличие от Objective-C, где Вы должны были создать свой класс на основе NSObject или другого произвольного класса от NSObject).

Добавьте следующий код во внутрь фигурных скобок:

// 2
  let total: Double
  let taxPct: Double
  let subtotal: Double

Так Вы создаете свойства класса - точно так же, как и создаете переменные или константы. Здесь Вы создаете три свойства - одно для итогов (после налогообложения), одино для процента налога, который был применен к законопроекту, и один до итогов (до налогообложения).

Обратите внимание на то, что любые свойства, которые Вы объявляете, должны быть установлены в начальное значение, когда Вы объявляете их, или в Вашем инициализаторе – иначе Вы должны будете объявить их как дополнительные.

Добавьте следующий код после предыдущего блока (в фигурных скобках):

 // 3
  init(total:Double, taxPct:Double) {
    self.total = total
    self.taxPct = taxPct
    subtotal = total / (taxPct + 1)
  }

Это создает инициализатор для класса, который принимает два параметра. Инициализаторы в языке Swift всегда называются - Init, если хотите, Вы можете иметь более одного инициализатора, но они должны принимать различные параметры.

Обратите внимание, что я передал параметры для этого метода с теми же именами что и свойства этого класса. Мне нужно различать их, поэтому я поставил префикс перед именами свойств.

Обратите внимание, что поскольку нет никакого конфликта имен для свойств, и Вам не нужно писать ключевое слово self, потому что компилятор делает это за Вас автоматически.

Добавьте следующий код после предыдущего блока (в фигурных скобках):

 // 4
  func calcTipWithTipPct(tipPct:Double) -> Double {
    return subtotal * tipPct
  }

Для обьявления метода используется ключевое слово func. Далее список параметров (для них должны быть явно указаны типы), далее добавьте символ ->, и укажите тип возвращаемого параметра.

Это функция, определяет количество чаевых которое нужно дать; она просто умножает итоговую сумму на процент.

Добавьте следующий код после предыдущего блока (в фигурных скобках):

// 5
  func printPossibleTips() {
    println("15%: \(calcTipWithTipPct(0.15))")
    println("18%: \(calcTipWithTipPct(0.18))")
    println("20%: \(calcTipWithTipPct(0.20))")
  }

Это новый метод, который распечатывает три возможных варианта чаевых.

Обратите внимание на то, что при вызове этого метода для экземпляра класса, первым параметром не должно быть его имя.

Также, обратите внимание, что строка интерполяции служит не только для вывода значений переменных. Вы можете использовать все виды сложных вызовов методов и операций, если Вам это нравится!

Добавьте этот код в нижней части playground (после фигурных скобок):

// 6
let tipCalc = TipCalculator(total: 33.25, taxPct: 0.06)
tipCalc.printPossibleTips()

Наконец, Вам необходимо создать экземпляр класса калькулятора чаевых и вызвать метод print для отображения возможныех чаевых.

Вот примерно так должен выглядеть Ваш файл playground:

// 1
class TipCalculator {
 
  // 2
  let total: Double
  let taxPct: Double
  let subtotal: Double
 
  // 3
  init(total:Double, taxPct:Double) {
    self.total = total
    self.taxPct = taxPct
    subtotal = total / (taxPct + 1)
  }
 
  // 4
  func calcTipWithTipPct(tipPct:Double) -> Double {
    return subtotal * tipPct
  }
 
  // 5
  func printPossibleTips() {
    println("15%: \(calcTipWithTipPct(0.15))")
    println("18%: \(calcTipWithTipPct(0.18))")
    println("20%: \(calcTipWithTipPct(0.20))")
  }
 
}
 
// 6
let tipCalc = TipCalculator(total: 33.25, taxPct: 0.06)
tipCalc.printPossibleTips()

Проверьте результат в Assistant Editor.

Массивы и циклы

В настоящее время существует определенное дублирование кода, потому что мы вызываем метод calcTipWithTotal несколько раз с различными процентными ставками. Мы могли бы уменьшить дублирование кода с помощью массивов.

Замените содержимое метода printPossibleTips следующим:

let possibleTipsInferred = [0.15, 0.18, 0.20]
let possibleTipsExplicit:Double[] = [0.15, 0.18, 0.20]

Это иллюстрирует пример создания массивов, в которых внутри значения типа doubles, как предполагаемые, так и c явной типизациеий

Затем добавьте вниз, следующие строки кода:

for possibleTip in possibleTipsInferred {
  println("\(possibleTip*100)%: \(calcTipWithTipPct(possibleTip))")
}

Перечисление элементов в массиве похоже на быстрое перечисление в Objective-C - но обратите внимание, что нет никаких круглых скобок!

Вы также могли бы написать этот цикл так:

for i in 0..possibleTipsInferred.count {
  let possibleTip = possibleTipsInferred[i]
  println("\(possibleTip*100)%: \(calcTipWithTipPct(possibleTip))")
}

Оператор “..” - это оператор который не включает значение верхней границы массива. Также есть оператор “…”, который включает значение верхней границы массива.

Массивы имеют свойство count - для определения количества элементов в массиве. Вы также можете искать определенный элемент в массиве, синтаксис поиска будет таковым: arrayName [index].

Dictionaries (Словари)

Давайте сделаем последние изменение в Tip Calculator. Вместо того, чтобы просто распечатывать результат, Вы можете вернуть словарь с результатами. Это облегчит отображения результатов, в другом пользовательском интерфейсе.

Удалите метод printPossibleTips и замените его следующим:

// 1
func returnPossibleTips() -> Dictionary<Int, Double> {
 
  let possibleTipsInferred = [0.15, 0.18, 0.20]
  let possibleTipsExplicit:Double[] = [0.15, 0.18, 0.20]
 
  // 2
  var retval = Dictionary<Int, Double>()
  for possibleTip in possibleTipsInferred {
    let intPct = Int(possibleTip*100)
    // 3
    retval[intPct] = calcTipWithTipPct(possibleTip)
  }
  return retval
 
}

Давайте пройдемся по этим разделам:

Процент чаевых имеет интервал от 15% до 20%.

1. Обьявляем метод, который возвращает словарь, в котором находится ключ типа Int (процент подсказки типа int, 15 или 20 \\ то же самое” tip - не подсказка здесь, а чаевые, как я предполагаю”\\), и Double значение (посчитаный результат).

2. Вы создаете пустой словарь. Обратите внимание на то, что это должен быть изменяемый словарь, Вы должны объявить его как переменную var, а не константу let. В противном случае, Вы получите ошибку при компиляции.

3. Установите элемент в словарь. Как Вы видите, синтаксис похож на синтаксис в Objective-C.

Напоследок, измените последнюю строку в playground для вызова этого метода:

tipCalc.returnPossibleTips()

После того, как playground все подсчитает, Вы должны увидеть результаты в виде словаря в инспекторе (нажмите на значек “глаза” для расширенного представления результата)

Поздравляю, Вы получили полностью рабочий Tip Calculator, написанный на языке Swift!

Добавить комментарий