Учебник Swift — разработка приложения для iOS8 [Часть 1, Hello World!] / Хабр

Учебник Swift — разработка приложения для iOS8 [Часть 1, Hello World!] / Хабр Без рубрики

Hello, world!

В первую очередь, мы напишем самое простое приложение, которое только можно представить, чтобы начать работу —

Наше приложение будет делать только одно: печатать фразу «Hello, World!» в консоль. Для этого нам потребуется установленная IDE XCode, для скачивания которой необходима учётная запись разработчика. Если у вас есть аккаунт, то смело качайте с официального сайта

, желательно это сделать до прочтения ниже описанного.

Учебник Swift — разработка приложения для iOS8 [Часть 1, Hello World!] / Хабр


Итак, вы установили свою копию IDE. Теперь давайте выведем «Hello, World!» на консоль.Этот пример не только демонстрирует простейшее приложение, которое можно написать, но и, что немаловажно, показывает, что среда разработки настроена правильно.

В XCode создайте проект с помощью шаблона приложения с одним видом («Single View Application»).

Учебник Swift — разработка приложения для iOS8 [Часть 1, Hello World!] / Хабр

Убедитесь, что вы выбрали Swift в качестве языка приложения.

Учебник Swift — разработка приложения для iOS8 [Часть 1, Hello World!] / Хабр

Теперь вы должны найти файл AppDelegate.swift в иерархии проекта. Внутри найдите следующую строку:

"// Override point for customization after application launch."


Замените эту строку на наш изумительный код:

println("Hello World")

Учебник Swift — разработка приложения для iOS8 [Часть 1, Hello World!] / Хабр

Теперь нажмите «Run». Вы должны увидеть загрузившееся пустое приложение и слова

Hello, World!

, напечатанные в консоли, расположенной в нижней части окна XCode. Заметьте, это не будет отображаться в симуляторе iPhone.

Учебник Swift — разработка приложения для iOS8 [Часть 1, Hello World!] / Хабр

Поздравляю! Вы только что написали своё первое приложение на Swift! Правда оно не получит никаких премий, призов, только ваши собственные овации. А теперь, давайте копнём немножко глубже…

‎python programming interpreter

Write Python code directly on your iPhone, iPad and iPod Touch! This app is ideal for learning and testing code snippets!

Python is an interpreted, high-level, general-purpose programming language. Created by Guido van Rossum and first released in 1991, Python’s design philosophy emphasizes code readability with its notable use of significant whitespace. Its language constructs and object-oriented approach aim to help programmers write clear, logical code for small and large-scale projects.

Features:
— Compile and run your program
— Supports plotting and graphing
— View program output or detailed error
— Select and run chunk of codes
— Custom keyboard for easy input of frequently used characters
— Optimized for connecting with external physical/bluetooth keyboard
— Advanced source code editor with syntax highlighting, code completion and line numbers
— Open, save, import and share Python files
— Language reference
— Support different Python compiler versions namely: 3.8 and 3.9
— Access thousands of packages
— Install additional packages

Limitations:
— Internet connection is required for compilation
— Maximum program running time is 20s
— Some file system, network and graphics functions may be limited
— This is a batch compiler; interactive programs are not supported. For example, if your program provides an input prompt, enter the input in the Input tab prior to compilation.

GET FULL ACCESS
Upgrade to a Premium Membership and Receive the Following Ongoing Value:
• No ads
• Unlimited plots
• Install packages
• Latest interpreters

If you choose to purchase a subscription, payment will be charged to your iTunes account, and your account will be charged within 24-hours prior to the end of the free trial or current period. Subscription with a free trial period will automatically renew to a paid subscription. Any unused portion of a free trial period (if offered) will be forfeited when you purchase a premium subscription during the free trial period. You can cancel the automatic renewal of your subscription at any time by going to your settings in the iTunes store after purchase. The cancellation will take effect the day after the last day of the current subscription period, and you will be downgraded to the free service.

Terms & Conditions: https://kappsmart.com/pythoncompiler/terms.html
Privacy Policy: https://kappsmart.com/pythoncompiler/privacy_policy.html

Pythonista. изучение программирования на ipad | всё об ipad

pythonistaВсем привет! Долго не решался писать на такую специфичную для себя и специфическую вообще тему, как программирование. Но надумал в итоге, тем более конкурс. (:

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

Плюс ко всему, я определил «убить двух зайцев»:

1. Выучить какой-нибудь язык программирования (ЯП), начиная с азов самого программирования.

2. Подтянуть английский язык в процессе изучения ЯП.

После просмотра различных материалов, чтения холиваров на тему: «Какой ЯП лучший и какой ЯП лучше для новичков», я остановился на языке Python. Думаю, не стоит обсуждать в статье причины такого выбора, иначе придется отойти далеко от самой темы.

Само собой, для изучения ЯП нужно немало времени, такое время у меня есть в дороге, а в дороге у меня есть iPad. Вы уже, наверное, поняли к чему клоню? (;

Стал я искать приложения для Python. Так как код на Python не требует предварительной компиляции (происходит на лету и сразу исполняется), от приложения требовалось, чтобы в нем был редактор кода (с подсветкой и подсказками синтаксиса) и интерпретатор (чтобы сразу смотреть на результат). Таких приложений оказалось немало, свои задачи они выполняли, но одно меня заинтересовало и удивило очень сильно. Итак, Pythonista.

Pythonista iPad

Интерфейс, как видите, понятный и приятный для глаз. В отличие от своих собратьев по Python, приложение интерпретирует код в режиме офлайн, что несомненно является плюсом. Вот самый классический пример:

Pythonista iPad

Pythonista iPad

Клавиатура дополнена необходимыми знаками для удобного ввода кода (до Textastiс не дотягивает, конечно, но все равно вполне сносная). Подсветка и подсказки синтаксиса есть, как и требовалось, темы и шрифты изменяются в настройках.

Pythonista iPad

Проводник отображает файлы как списком, так и в виде превью: смотрится симпатично и на деле практично.

Pythonista iPad

В проводнике имеется несколько файлов с образцами программ различного назначения, которые наглядно показывают возможности приложения. Вот, например, игра по поиску пар под названием «Cards» (к этой игре мы еще обратимся в видео ниже):

Pythonista iPad

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

Pythonista iPad
Pythonista iPad
Учебник Swift — разработка приложения для iOS8 [Часть 1, Hello World!] / Хабр

Теперь о самом главном и одновременно о печальном – о модулях. Так как язык Python знаменит расширением своих возможностей за счет подключаемых блоков (например, графических), а iOS знаменита своей закрытостью, мы имеем очень ограниченный набор этих самых модулей для создания программ. Хорошо хотя бы картинки свои можно добавлять.

Pythonista iPad

Описание всех модулей, как и описание всех остальных возможностей программы можно найти в справке. Естесственно, все на английском (второй «заяц», если помните).

Pythonista iPad

С импортом готового кода дела обстоят не очень – банальный копипаст, подключения к облакам отсутствуют. К Dropbox можно подключаться через аккаунт разработчика, однако с этими «костылями» я так пока и не разобрался. А вот с экспортом наоборот – все очень интересно:

Pythonista iPad

Помимо обычных отправок по email или открытия в другом приложении, код можно выложить на GistHab (сервис для хостинга IT-проектов), а также (внимание!) скомпилировать в виде проекта приложения для iPad/iPhone. Писать игры я еще не умею и в следующем видео воспользуюсь образцом уже знакомой нам игрушки «Cards» для запуска на эмуляторе iPad (на «живом» девайсе попробовать не могу, так как не имею аккаунта разработчика).

Видео

Согласитесь, заманчиво написать для iPad на iPad?

Подведу итог

Плюсы:

– качество приложения в сравнении с подобными и качество поддержки приложения;
– подсветка и подсказки синтаксиса;
– исполнение кода в оффлайне;
– перспективы развития;
– возможности экспорта в Xcode.

Минусы:

– ограниченный набор модулей (этот минус связан со спецификой iOS, разработчик программы постоянно развивает ее и добавляет новые модули);
– неудобный импорт готового материала (этот минус на совести Apple, так как политика фирмы запрещает прямой импорт кода);
– поддержка только 2-ой ветки языка (для справки: существует обновленная версия ЯП третьего поколения, которая несовместима со второй версией. Вместе с тем вторая версия настолько распространена, что отказываться от нее не собираются еще долго);
– цена (кому-то покажется высокой, хотя для такого приложения стоимость оправдана).

Читайте также:  Лучшие приложения для программирования на iPad и iPhone »

Изучение языка программирования – дело нелегкое, однако такие программы, как Pythonista, оказывают неоценимую помощь в освоении. Программа может вызвать снисходительную улыбку у профессиональных программистов, но не торопитесь, уважаемые профессионалы – судя по материалам документации программа намного глубже, сложнее и богаче, чем кажется на первый взгляд.

# С уважением, niks26

Болевые точки

Я организовал несколько семинаров по автономному программированию и привел студентов для решения задач науки о данных на Python.

Одна из самых хлопотных — установка операционной среды.

Если честно, перед тем, как принять участие в семинаре, я серьезно подготовился.

Например, в интегрированной среде выбрана Anaconda, которая очень удобна для пользователя.

Код работает на моем компьютере Macbook без проблем. Я также заставил студентов запустить Windows 7, и это не проблема. Это было загружено на Github.

ВыпущенныйУчебные статьиЗдесь я также написал очень подробные инструкции по установке программного пакета.

Также для установки и работы Anaconda, среды выполнения Python, специальная записьвидео。

Однако проблемы, возникшие на семинаре, по-прежнему были разнообразными.

Некоторые из них — операционные системы. Например, вы можете использовать Windows 10. Если честно, никогда не пользовался. Глядя на него с Surface, я даже не могу найти папку Anaconda после установки.

Некоторые кодируют. В разных операционных системах по умолчанию используется китайская кодировка UTF-8, а некоторые — GBK. Для того же фрагмента китайского текста здесь все нормально, но символы искажены.

Некоторые из них — это пути к пакетам. Перед тем, как прийти на семинар, вы, возможно, видели некоторые из моих руководств и устанавливали версию Python 2.7 Anaconda. Когда вы зашли на сайт, то увидели, что нужен Python 3.6, и установили новый. В результате вы не можете определить, из какого пакета выполняются команды Python и pip, и даже не знаете, где этот пакет установлен. Вкупе с настройкой виртуальной среды вы сходите с ума.

Есть даже проблемы с перегрузкой сети. Поскольку иногда необходимо установить и вызвать огромный пакет программного обеспечения на месте, десятки компьютеров «вместе» соревнуются за ограниченную пропускную способность Wi-Fi, и последствия можно представить.

Узнав об этом, я решил изменить статус-кво.

Текущий учебник предоставляет только базовый исходный код. Для многих начинающих студентов этого недостаточно.

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

Есть много обходных путей. Например, просто запишите видео выполнения кода, чтобы показать вам.

Но как я сказал вОбучение MOOC, что самое важное?»Как сказано в статье, в процессе обученияОбратная связьсамое важное.

У вас должна быть возможность запустить код и получить обратную связь о результатах с первого раза.

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

Я должен предоставить вам среду, которую можно запускать напрямую.

Нулевая установка, Естественно таких заморочек нет.

Это возможно?

Я исследовал это, без проблем.

Если на вашем устройстве установлен современный браузер (включая, помимо прочего, Google Chrome, Firefox, Safari, Microsoft Edge и т. Д.).

IE 8.0?

Это не сработает, так что поторопитесь и обновитесь!

Прочитав это, вы должны понять. Потому что только браузер, а не операционная система, не говоря уже о Windows 10, вы можете запускать код на iPad.

Добавление table view

В этом разделе мы попробуем добавить материал на экран. Откройте в XCode файл Main.storyboard, перенесите из Библиотеки Объектов («Object Library») объект

Table View

на экран приложения, растяните таблицу так, чтобы она совпала с краями. Затем измените высоту, перетянув верхний край, оставив небольшое пространство сверху (это необходимо для строки состояния). Если вы запустите приложение, то увидите в симуляторе пустую таблицу.

Учебник Swift — разработка приложения для iOS8 [Часть 1, Hello World!] / Хабр

Теперь необходимо создать делегат и источник данных для таблицы. Это легче всего сделать в конструкторе интерфейса. Нажмите клавишу «Command», кликните и перетащите

Table View

к объекту

View Controller

в иерархии файла .storyboard, и выберите «источник данных» («data source»). Повторите с опцией «delegate».

Примечание:Я получил целую тонну вопросов о вышесказанном, т.к. многие люди сообщают о том, что у них не устанавливается табличный вид. Поэтому, я записал видео, поясняющее как работает подключение объектов Storyboard в коде. Для просмотра перейдите в полноэкранный режим и выберите опцию 720p, чтобы вы могли заметить всё, что вас интересует. Это будет немного отличаться от интерфейса XCode, но функционально всё работает также.

А теперь давайте углубимся в методы протоколов для табличного представления. Из-за использования UITableViewDataSource и UITableViewDelegate мы должны изменить определение класса.Откройте файл и замените строку

class ViewController: UIViewController {

следующей

class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {


Если вы нажмёте клавишу «Command» и кликните на один из этих протоколов, то увидите «обязательные» функции. Для табличного представления необходимы как минимум эти две:

func tableView(tableView: UITableView!, numberOfRowsInSection section: Int) -> Int
func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell!

Изменим наш класс

View Controller

путём добавления этих двух функций:

func tableView(tableView: UITableView!, numberOfRowsInSection section:    Int) -> Int {
   return 10
}

func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell! {
   let cell: UITableViewCell = UITableViewCell(style: UITableViewCellStyle.Subtitle, reuseIdentifier: "MyTestCell")
 
   cell.textLabel.text = "Row #(indexPath.row)"
   cell.detailTextLabel.text = "Subtitle #(indexPath.row)"
 
   return cell
}

https://www.youtube.com/watch?v=-xhlSS-u70g

Первый метод возвращает количество строк в разделе. В нашем примере используется «магическое» число 10, однако вместо него, как правило, должна использоваться длинна контроллера массива. Наш же код умышленно упрощён.

Во втором методе происходит чистой воды волшебство. Мы создаём экземпляр класса UITableViewCell(cell), используя стиль ячейки Subtitle. Затем мы присваиваем текстовому значению этой ячейки значение «Row #(indexPath.row)».

Детализированная текстовая метка (detailTextLabel) доступна только при использовании класса ячеек Subtitle, который мы используем в данном примере.

При запуске приложения вы увидите восхитительный список ячеек с заголовками и подзаголовками, показывающие номера их строк. Это один из наиболее распространённых способов отображения данных в iOS, вы убедитесь, он вам ещё не раз пригодится. Увидеть полный текст кода вы можете на github.

В следующем посте мы исследуем использование API поиска iTunes для создания приложения, способного искать и отображать альбомы внутри iTunes Store.

Моя история в it: как самостоятельно изучить swift и стать ios-разработчиком

Объекты и классы


Для создания класса используется зарезервированное слово

class

. Члены класса объявляются точно так же, как и обычные константы и переменные. Более того, методы класса объявляются как обычные функции.

class Shape {
    var numberOfSides = 0
    func simpleDescription() -> String {
        return "A shape with (numberOfSides) sides."
    }
}

Давайте поэкспериментируем
Добавьте константу-член класса и метод класса, принимающую ее в качестве своего аргумента.

Чтобы создать экземпляр (объект) класса, достаточно добавить круглые скобки после названия класса. Доступ к методам и членам класса осуществляется через точку.

var shape = Shape()
shape.numberOfSides = 7
var shapeDescription = shape.simpleDescription()


В этом примере мы упустили одну важную деталь – конструктор класса, метод

Читайте также:  iFile – файловый менеджер для iPad | Всё об iPad

init

class NamedShape {
    var numberOfSides: Int = 0
    var name: String
    
    init(name: String) {
        self.name = name
    }
    
    func simpleDescription() -> String {
        return "A shape with (numberOfSides) sides."
    }
}

Обратите внимание, как член класса name при помощи

self

отделен от аргумента конструктора

name

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

numberOfSides

), либо в конструкторе (как

name

Деструктор класса – метод deinit, который можно переписать в случае необходимости.

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

Переопределенные дочерним классом методы должны быть помечены ключевым словом override – переопределение методов без override приведет к ошибке. Компилятор также выявляет методы, маркированные override, но не переопределяющие какие-либо методы своего родительского класса.

class Square: NamedShape {
    var sideLength: Double
    
    init(sideLength: Double, name: String) {
        self.sideLength = sideLength
        super.init(name: name)
        numberOfSides = 4
    }
    
    func area() ->  Double {
        return sideLength * sideLength
    }
    
    override func simpleDescription() -> String {
        return "A square with sides of length (sideLength)."
    }
}
let test = Square(sideLength: 5.2, name: "my test square")
test.area()
test.simpleDescription()

Давайте поэкспериментируем
Создайте класс Circle и наследуйте его от класса NamedShape. Конструктор класса Circle принимает два аргумента – радиус и название. Переопределите методы area и describe этого класса.


Члены класса могут также иметь собственные

gettersetter

class EquilateralTriangle: NamedShape {
    var sideLength: Double = 0.0
    
    init(sideLength: Double, name: String) {
        self.sideLength = sideLength
        super.init(name: name)
        numberOfSides = 3
    }
    
    var perimeter: Double {
    get {
        return 3.0 * sideLength
    }
    set {
        sideLength = newValue / 3.0
    }
    }
    
    override func simpleDescription() -> String {
        return "An equilateral triagle with sides of length (sideLength)."
    }
}
var triangle = EquilateralTriangle(sideLength: 3.1, name: "a triangle")
triangle.perimeter
triangle.perimeter = 9.9
triangle.sideLength

setter

-е переменной

perimeter

новое присваиваемое значение неявно называется

newValue

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

set

Обратите внимание на структуру конструктора класса EquilateralTriangle. Этот метод включает в себя три последовательных шага:

  1. инициализация членов дочернего класса;
  2. вызов конструктора родительского класса;
  3. изменение значений членов родительского класса.

Если вам необходимо выполнить определенный код до или после присваивания нового значения переменной, вы можете переопределить методы

willSetdidSet

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

class TriangleAndSquare {
    var triangle: EquilateralTriangle {
    willSet {
        square.sideLength = newValue.sideLength
    }
    }
    var square: Square {
    willSet {
        triangle.sideLength = newValue.sideLength
    }
    }
    init(size: Double, name: String) {
        square = Square(sideLength: size, name: name)
        triangle = EquilateralTriangle(sideLength: size, name: name)
    }
}
var triangleAndSquare = TriangleAndSquare(size: 10, name: "another test shape")
triangleAndSquare.square.sideLength
triangleAndSquare.triangle.sideLength
triangleAndSquare.square = Square(sideLength: 50, name: "larger square")
triangleAndSquare.triangle.sideLength

У методов классов имеется одно важное отличие от функций. Названия аргументов функции используются только в пределах этой функции, тогда как в методе класса параметры также используются при вызове этого метода (кроме первого параметра). По умолчанию метод класса имеет одинаковые названия параметров как при вызове, так и внутри себя. Однако вы можете указать другое название (в примере ниже –

times

), которое будет использовано только внутри этого метода. При этом для вызова этого метода необходимо использовать первое название (

numberOfTimes

class Counter {
    var count: Int = 0
    func incrementBy(amount: Int, numberOfTimes times: Int) {
        count  = amount * times
    }
}
var counter = Counter()
counter.incrementBy(2, numberOfTimes: 7)

При работе с опциональными значениями добавьте знак вопроса (

?

) перед методами, членами класса и т.д. Если значение перед знаком вопроса равно

nil

, все, что следует после (

?

) игнорируется и значение всего выражения равно

nil

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

let optionalSquare: Square? = Square(sideLength: 2.5, name: "optional square")
let sideLength = optionalSquare?.sideLength

Перечисления и структуры


Для создания перечислений используется ключевое слово

enum

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

enum Rank: Int {
    case Ace = 1
    case Two, Three, Four, Five, Six, Seven, Eight, Nine, Ten
    case Jack, Queen, King
    func simpleDescription() -> String {
        switch self {
        case .Ace:
            return "ace"
        case .Jack:
            return "jack"
        case .Queen:
            return "queen"
        case .King:
            return "king"
        default:
            return String(self.toRaw())
        }
    }
}
let ace = Rank.Ace
let aceRawValue = ace.toRaw()

Давайте поэкспериментируем
Напишите функцию, которая сравнивает 2 перечисления типа Rank по их значениям.

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

Для преобразования исходного типа значения в тип перечисления используйте функции toRaw и fromRaw.

if let convertedRank = Rank.fromRaw(3) {
    let threeDescription = convertedRank.simpleDescription()
}


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

enum Suit {
    case Spades, Hearts, Diamonds, Clubs
    func simpleDescription() -> String {
        switch self {
        case .Spades:
            return "spades"
        case .Hearts:
            return "hearts"
        case .Diamonds:
            return "diamonds"
        case .Clubs:
            return "clubs"
        }
    }
}
let hearts = Suit.Hearts
let heartsDescription = hearts.simpleDescription()

Давайте поэкспериментируем
Добавьте метод Color, возвращающий строку “black” для Spades и Clubs и “red” для Hearts и Diamonds.

Обратите внимание на то, как осуществляется доступ к члену

Hearts

перечисления

Suit

. При присваивании значения константе

hearts

используется полное имя

Suit.Hearts

, поскольку мы явно не указываем тип этой константы. А в

switch

мы используем сокращенную форму

.Hearts

, поскольку тип значения

self

априори известен. Вы можете использовать сокращенную форму повсеместно, если тип переменной явно указан.

Для создания структур используется ключевое слово struct. Структуры имеют множество схожих черт с классами, включая методы и конструкторы. Одним из наиболее существенных отличий структур от классов является то, что экземпляры структур, в отличие от экземпляров классов, передаются в функции по значению (то есть предварительно создается их локальная копия), тогда как экземпляры классов передаются по ссылке.

struct Card {
    var rank: Rank
    var suit: Suit
    func simpleDescription() -> String {
        return "The (rank.simpleDescription()) of (suit.simpleDescription())"
    }
}
let threeOfSpades = Card(rank: .Three, suit: .Spades)
let threeOfSpadesDescription = threeOfSpades.simpleDescription()

Давайте поэкспериментируем
Добавьте в структуру Card метод, который создает полную колоду карт.

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

success

в примере). Связанные и исходные значения это разные вещи: исходное значение члена перечисления всегда постоянно для всех экземпляров перечисления и указывается при его объявлении.

Рассмотрим пример получения с сервера времени восхода и заката Солнца. Сервер отправляет в ответ либо соответствующую информацию, либо сообщение об ошибке.

enum ServerResponse {
    case Result(String, String)
    case Error(String)
}
 
let success = ServerResponse.Result("6:00 am", "8:09 pm")
let failure = ServerResponse.Error("Out of cheese.")
 
switch success {
case let .Result(sunrise, sunset):
    let serverResponse = "Sunrise is at (sunrise) and sunset is at (sunset)."
case let .Error(error):
    let serverResponse = "Failure...  (error)"
}

Давайте поэкспериментируем
Добавьте третий вариант в оператор множественного выбора switch


Обратите внимание, каким образом из объекта

ServerResponse

“вытаскиваются” время восхода и заката.

Простые типы данных

Используйте

let

для создания константы и

var

для создания переменной. Тип константы указывать не нужно, вы можете присвоить ей значение лишь единожды.

var myVariable = 42
myVariable = 50
let myConstant = 42

Типы константы и переменной должны совпадать с типами присваиваемых им соответствующих значений. Однако это не означает, что вы должны напрямую указывать их тип. Компилятор автоматически определит тип константы и переменной при присваивании им значения. Так, в приведенном примере компилятор определит, что

myVariable

имеет целочисленный тип.

Если же инициализатор отсутствует или не предоставляет достаточной информации, вы можете указать тип самостоятельно после переменной, разделив название и тип двоеточием:

let implicitInteger = 70
let inplicitDouble = 70.0
let inplicitDouble: Double = 70

Давайте поэкспериментируем
Создайте константу с типом Float и проинициализируйте ее числом 4.


Значения никогда не конвертируются в другой тип неявно. Если вам необходимо конвертировать значение в другой тип, делайте это явно:

let label = "The width is "
let width = 94
let widthLabel = label   String(width)

Давайте поэкспериментируем
Попробуйте удалить явное преобразование к типу String в последней строке. Какую ошибку вы получите?

Имеется более простой способ включения значений в строки: для этого заключите выражение в скобки и поставьте перед ними обратный слэш (

Читайте также:  Angry Birds Star Wars 2 для iPhone и iPad Да пребудут с вами птицы | Яблык

). Пример:

let apples = 3
let oranges = 5
let appleSummary = "I have (apples) apples."
let fruitSummary = "I have (apples   oranges) pieces of fruit."

Давайте поэкспериментируем
Попробуйте использовать конструкцию () и выведите на экран строку, включающую результат суммы двух целочисленных переменных и чье-нибудь имя.


При работе с массивами и ассоциативными массивами (словарями, dictionary) используются квадратные скобки (

[]

Протоколы и расширения.

Для объявления протокола используйте ключевое слово

protocol

protocol ExampleProtocol {
    var simpleDescription: String { get }
    mutating func adjust()
}

Протоколы могут поддерживаться классами, перечислениями и структурами.

class SimpleClass: ExampleProtocol {
    var simpleDescription: String = "A very simple class."
    var anotherProperty: Int = 69105
    func adjust() {
        simpleDescription  = "  Now 100% adjusted."
    }
}
var a = SimpleClass()
a.adjust()
let aDescription = a.simpleDescription
 
struct SimpleStructure: ExampleProtocol {
    var simpleDescription: String = "A simple structure"
    mutating func adjust() {
        simpleDescription  = " (adjusted)"
    }
}
var b = SimpleStructure()
b.adjust()
let bDescription = b.simpleDescription

Давайте поэкспериментируем
Создайте перечисление, которое будет реализовывать этот протокол.


Обратите внимание на ключевое слово

mutating

в определении структуры

SimpleStructure

, которое информирует компилятор о том, что соответствующий метод подвергает структуру изменениям. В противовес этому методы класса

SimpleClass

не нужно маркировать как

mutating

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

Для добавления новых методов или членов класса в уже существующий тип необходимо использовать расширения – extensions. Вы также можете использовать расширения для реализации протокола уже существующим типом, даже если он импортирован из какой-либо библиотеки или фреймворка.

extension Int: ExampleProtocol {
    var simpleDescription: String {
    return "The number (self)"
    }
    mutating func adjust() {
        self  = 42
    }
}
7.simpleDescription

Давайте поэкспериментируем
Создайте расширение типа Double с переменной-членом absoluteValue.

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

let protocolValue: ExampleProtocol = a
protocolValue.simpleDescription
// protocolValue.anotherProperty  // Uncomment to see the error

Несмотря на то, что во время выполнения программы переменная

protocolValue

имеет тип

SimpleClass

, компилятор считает, что ее тип –

ExampleProtocol

. Это означает, что вы не сможете случайно получить доступ к методам или членам класса, которые реализуются вне протокола

ExampleProtocol

Условия и циклы


Для создания условий используются операторы

ifswitch

, для создания циклов –

for-inforwhiledo-while

. При этом выделять круглыми скобками условия и инициализирующие выражения необязательно, тогда как фигурные скобки обязательны.

let individualScores = [75, 43, 103, 87, 12]
var teamScore = 0
for score in individualScores {
    if score > 50 {
        teamScore  = 3
    } else {
        teamScore  = 1
    }
}
teamScore

Условие внутри оператора

if

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

if score {…}

является ошибочным, поскольку здесь нет явного сравнения (например, с нулем).

Условный оператор if можно использовать совместно с let и var для работы с константами и переменными, которые могут иметь значение nil. Такие константы и переменные называются опциональными (то есть они могут либо принимать какое-либо значение, либо быть равны nil). Чтобы создать опциональную переменную или константу добавьте знак вопроса (?) после указания типа.

 var optionalString: String? = "Hello"
optionalString == nil
 
var optionalName: String? = "John Appleseed"
var greeting = "Hello!"
if let name = optionalName {
    greeting = "Hello, (name)"
}

Давайте поэкспериментируем
Измените optionalName на nil. Что вы видите на экране? Добавьте блок else для обработки случая, когда optionalName равен nil.

Если опциональное значение равно

nil

, условие будет ложным и код в фигурных скобках после

if

выполнен не будет. В противном случае переменной

greeting

будет присвоено новое значение.

Оператор множественного выбора switch поддерживает внутри себя множество других операторов сравнения и не ограничен лишь простыми сравнениями:

let vegetable = "red pepper"
switch vegetable {
case "celery":
    let vegetableComment = "Add some raisins and make ants on a log."
case "cucumber", "watercress":
    let vegetableComment = "That would make a good tea sandwich."
case let x where x.hasSuffix("pepper"):
    let vegetableComment = "Is it a spicy (x)?"
default:
    let vegetableComment = "Everything tastes good in soup."
}

Давайте поэкспериментируем
Попробуйте удалить условие по умолчанию. Какую ошибку вы получите?

После выполнения подходящего блока кода, программа покидает оператор

switch

, не проверяя последующие условия. Таким образом вам не нужно вручную добавлять операторы прерывания (

break

) в конце каждого блока

case

Для перебирания элементов ассоциативного массива используйте оператор for-in совместно с указанием пары имен для каждой пары ключ-значение.

let interestingNumbers = [
    "Prime": [2, 3, 5, 7, 11, 13],
    "Fibonacci": [1, 1, 2, 3, 5, 8],
    "Square": [1, 4, 9, 16, 25],
]
var largest = 0
for (kind, numbers) in interestingNumbers {
    for number in numbers {
        if number > largest {
            largest = number
        }
    }
}
largest

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

Оператор цикла

while

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

var n = 2
while n < 100 {
    n = n * 2
}
n
 
var m = 2
do {
    m = m * 2
} while m < 100
m

Оператор

for

можно использовать для перебора последовательности чисел с помощью двух точек (

..

) или с помощью инициализатора, условия и инкремента. Посмотрите, эти два цикла делают одно и то же:

var firstForLoop = 0
for i in 0..3 {
    firstForLoop  = i
}
firstForLoop
 
var secondForLoop = 0
for var i = 0; i < 3;   i {
    secondForLoop  = 1
}
secondForLoop


При создании цикла используйте две точки (

..

), если не хотите включать большее значение в диапазон, и три точки (

), чтобы включить как меньшее, так и большее значения.

Функции и замыкания.

Для объявления функций используйте ключевое слово

func

. Вызов функции производится через указание ее имени и списка аргументов в круглых скобках. Возвращаемый тип следует отделить от перечня формальных аргументов с помощью

->

func greet(name: String, day: String) -> String {
    return "Hello (name), today is (day)."
}
greet("Bob", "Tuesday")

Давайте поэкспериментируем
Удалите параметр day. Вместо него добавьте переменную, обозначающую наименование подаваемого на обед блюда.


Если функция возвращает множество значений, следует использовать кортеж:

func getGasPrices() -> (Double, Double, Double) {
    return (3.59, 3.69, 3.79)
}
getGasPrices()

Функции также могут иметь неопределенное число аргументов:

func sumOf(numbers: Int...) -> Int {
    var sum = 0
    for number in numbers {
        sum  = number
    }
    return sum
}
sumOf()
sumOf(42, 597, 12)

Давайте поэкспериментируем
Напишите функцию, позволяющую находить среднее арифметическое произвольного числа своих аргументов.

Функции могут вкладываться друг в друга. Вложенная функция может обращаться к переменным, объявленным во внешней функции. Используйте вложенные функции, чтобы привести в порядок код сложной или большой функции.

func returnFifteen() -> Int {
    var y = 10
    func add() {
        y  = 5
    }
    add()
    return y
}
returnFifteen()

Функции являются объектами первого класса (first-class type), иными словами, функция в качестве свого результата может возвращать другую функцию.

func makeIncrementer() -> (Int -> Int) {
    func addOne(number: Int) -> Int {
        return 1   number
    }
    return addOne
}
var increment = makeIncrementer()
increment(7)


Функция также может принимать другую функцию в качестве одного из аргументов.

func hasAnyMatches(list: Int[], condition: Int -> Bool) -> Bool {
    for item in list {
        if condition(item) {
            return true
        }
    }
    return false
}
func lessThanTen(number: Int) -> Bool {
    return number < 10
}
var numbers = [20, 19, 7, 12]
hasAnyMatches(numbers, lessThanTen)

Функции являются частным случаем замыканий. Вы можете создать замыкание, не указывая его имени и окружив тело замыкания фигурными скобками (

{}

). Для отделения аргументов и типа возвращаемого значения от тела замыкания используйте оператор

in

numbers.map({
    (number: Int) -> Int in
    let result = 3 * number
    return result
    })

Давайте поэкспериментируем
Перепишите замыкание таким образом, чтобы оно возвращало ноль для всех лишних чисел.

Существует несколько техник, позволяющих делать замыкания более лаконичными. Если тип замыкания априори известен (например, это callback делегата), можно опустить указание типа его параметров и/или типа возвращаемого значения. Замыкания, состоящие из единственного выражения, неявно возвращают результат этого выражения.

numbers.map({ number in 3 * number })

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

sort([1, 5, 3, 12, 2]) { $0 > $1 }

Оцените статью
iPad Мобайл
Добавить комментарий