swift — вопросы с ответами

Основы

Язык программирования Swift создавался для осуществления следующих целей:

Безопасность

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

Современность

Swift содержит большое количество современных языковых функций, разработанных для облегчения выражения логики вашего кода. К ним относятся операторы переключения сопоставления с образцом (“Switches”), замыкания (“Closures”) и концепция всех значений, являющихся объектами, к которым можно прикрепить свойства и функции (“Extensions” – расширения).

Мощность

Swift имеет доступ ко всей среде выполнения Objective-C и легко соединяется с классами Objective-C. Это означает, что вы можете сразу использовать Swift для написания полнофункциональных приложений для iOS и OS X – вам не нужно ждать, пока кто-нибудь перенесет какие-либо функции из Objective-C в Swift. И если вы никогда не использовали Objective-C, вам даже не нужно о нем беспокоиться! Вы можете делать все, что вам нужно для разработки на платформах Apple, используя Swift.

Пример кода Swift

Этот фрагмент кода выполняет следующие действия:

  1. Сначала определяется функция sumNumbers. Эта функция принимает одно или несколько значений Int, которые являются целыми числами (целочисленной переменной), и возвращает одно значение Int. Int... обозначает, что функция принимает переменное число значений Int. Вы можете получить доступ к этим значениям через переменную numbers, которая является массивом.
  2. Внутри функции объявлена переменная total. Обратите внимание, что тип не указан – компилятор знает, что он хранит Int, потому что для него установлено целочисленное значение 0.
  3. Затем запускается цикл for-in, который перебирает все числа, отправленные методу. Еще раз обратите внимание, что тип числовой переменной не определен – компилятор делает вывод, что, учитывая, что числа являются массивом значений Int, число само должно быть Int.
  4. Значение числа добавляется к итогу.
  5. Когда цикл завершен, возвращается итоговое значение.
  6. Функция sumNumbers вызывается с набором целых чисел, а результат сохраняется в новой переменной sum. Эта переменная является константой: определяя ее с помощью ключевого слова let, мы сообщаем компилятору, что ее значение никогда не меняется. Попытка изменить значение константы является ошибкой.
  7. Наконец, мы отображаем значение с помощью функции печати, которая выводит значения на консоль.

Здесь также можно отметить еще несколько интересных вещей:

  • Обычно вам не нужно определять тип переменных. Компилятор сделает это за вас, в зависимости от того, какие значения вы используете;
  • Даже несмотря на то, что функция sumNumbers принимает переменное количество параметров, странного синтаксиса для этого случая не существует (если вы программист на C или C++, вы, возможно, помните, что не раз имели дело с va_start и его друзьями);
  • Переменные, которые объявлены с ключевым словом let, являются константами. Язык спроектирован так, что любые переменные, которые могут быть константами, должны быть ею, чтобы предотвратить случайные изменения позже. Важно отметить, что константы в Swift не должны быть известны во время компиляции. Вместо этого вы можете рассматривать их как переменные, которые устанавливаются только один раз.

Xcode

Для разработки приложений для любой платформы Apple вам придется использовать Xcode, интегрированную среду разработки этой компании. Xcode объединяет в одном пакете редактор исходного кода, отладчик, компилятор, профилировщик, симулятор iOS, симулятор Apple Watch и многое другое. Именно здесь вы будете проводить большую часть своего времени при разработке приложений.

Вы можете получить Xcode в Mac App Store. Просто откройте приложение App Store и выполните поиск «Xcode». Его загрузка абсолютно бесплатна, хотя и займет какое-то время (утилита занимает более 2 гигабайт).

Создать новый проект можно нажав по кнопке «Создать новый проект XCode» или перейдя по пути File → New → Project.

Вас спросят, какое приложение вы хотите создать. Селектор шаблонов разделен на две области. С левой стороны вы найдете коллекцию категорий приложений. Вы можете создать приложение для iOS, watchOS или OS X из шаблонов проектов, которые будут настраивать каталог проекта для начала работы.

Интерактивная среда

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

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

Очень полезно иметь быстрый доступ к интерактивной среде, когда вы учитесь и в конечном итоге работаете со Swift. Мы рекомендуем перетащить файл из интерактивной среды в док-станцию OS X. Таким образом, вы можете использовать его для быстрого и простого тестирования кода Swift.

Чтобы начать использовать интерактивную среду, ее нужно создать на экране «Welcome to Xcode», который появляется при запуске этого программного обеспечения.

Вы также можете выбрать File → New → New Playground и создать новую среду оттуда. В этой статье мы будем работать с интерактивными средами для iOS. Разница между средами для iOS и OS X заключается в том, что они просто имеют доступ к разным библиотекам.

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

Поток управления

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

Операторы if в Swift почти такие же, как и в любом другом языке, хотя в Swift нет необходимости заключать выражение, которое вы проверяете, в скобки:

В Swift тело всех операторов if, равно как и всех циклов, должно быть заключено в две скобки ({ и }). В C, C++, Java и Objective-C вы можете опустить эти фигурные скобки, если вы просто хотите, чтобы в вашем цикле был лишь один оператор или оператор if, например:

Циклы

Когда у вас есть коллекция элементов, например, массивов, вы можете использовать цикл for-in для итерации по каждому элементу:

Переменная числа, используемая в цикле for-in, создается неявно. Вам не нужно определять переменную с именем number, чтобы она работала.

Вы также можете использовать цикл for-in для итерации по диапазону значений. Например:

Обратите внимание на оператор ..< во второй строке. Это оператор диапазона, который Swift использует для описания диапазона чисел от одного значения до другого. На самом деле есть два оператора диапазона: две точки и левая угловая скобка (..<) или три точки без угловой скобки (...). Называемый оператором полу-диапазона, <.. означает диапазон, который начинается с первого значения и достигает, но не включает последнее значение. Например, диапазон 5..<9 содержит числа 5, 6, 7 и 8. Если вы хотите создать диапазон, который включает в себя последнее число, вы вместо этого используете оператор закрытого диапазона (...). Диапазон 5...9 содержит числа 5, 6, 7, 8 и 9. Вы можете использовать оператор включающего диапазона в циклах for-in, например:

Переключатели

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

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

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

Переключатели в Swift работают немного иначе, чем переключатели в C и Objective-C. В Swift выполнение раздела в выражении switch автоматически не «проваливается» в следующий раздел, что означает, что вам не нужно включать ключевое слово break в конце раздела.

Кроме того, операторы switch должны быть исчерпывающими. Это означает, что оператор switch должен охватывать все возможные значения. Если вы переключаетесь с использованием типа Bool, который может иметь значение true или false, вы должны предоставить обработчики для обоих значений. Если нет, то возникнет ошибка компилятора.

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

Переменные и константы

Переменная определяется в Swift, с помощью ключевого слова let или var:

Когда вы определяете переменную с помощью var, вам разрешается изменять ее значение. Если вы определите ее с помощью let, она никогда не сможет измениться. Swift рекомендует вам использовать константы как можно чаще, потому что они безопаснее – если вы знаете, что значение никогда не изменится, она точно не вызовет ошибку без вашего ведома:

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

42 ответа
У меня есть приложение, где вставка разделителя UITableView установлена ​​на пользовательские значения - Right 0, Left 0. Это отлично работает в iOS 7.x, однако в iOS 8.0 я вижу, что вставка разделителя установлена ​​по умолчанию 15 справа. Хотя в xib файлах он установлен на 0, он все равно отобража...
uitableview
ios8
10 сен. 2014, в 17:09
32 ответа
Скажем, у меня есть строка: var fullName: String = "First Last" Я хочу разбить базу строк на пробел и присвоить значения их соответствующим переменным var fullNameArr = // something like: fullName.explode(" ") var firstName: String = fullNameArr[0] var lastName: String? = fullnameArr[1] Кроме то...
string
split
05 сен. 2014, в 04:38
48 ответов
Я обновился до Xcode 6 beta 4, и теперь мое приложение постоянно вылетает с сообщением Неизвестный класс X в файле Interface Builder. Он сбой, потому что предположительно Xcode не может найти мои пользовательские классы, которые я связал в своей раскадровке, но он показывает, что они правильно с...
xcode
uistoryboard
interface-builder
xcode6
24 июль 2014, в 05:40
16 ответов
Как правило, файл хранилища sqlite для приложений с основными данными находится в Библиотекa > Поддержка приложений > iPhone Simulator > 7.1 (или в зависимости от того, какую версию вы используете) > Приложения > (какая папка содержит ваше приложение) > Документы но я не могу на...
10 июнь 2014, в 06:24
11 ответов
Я ищу способ получить доступ к базе данных SQLite в моем приложении с помощью кода Swift. Я знаю, что я могу использовать SQLite Wrapper в Objective C и использовать заголовок моста, но я предпочел бы сделать этот проект полностью в Swift. Есть ли способ сделать это, если да, может ли кто-нибудь ука...
08 июнь 2014, в 03:32
9 ответов
Я реализовывал алгоритм в Swift Beta и заметил, что производительность была очень плохой. Покопавшись глубже, я понял, что одним из узких мест является нечто такое же простое, как сортировка массивов. Соответствующая часть здесь: let n = 1000000 var x = [Int](repeating: 0, count: n) for i in 0..&l...
performance
algorithm
sorting
compiler-optimization
xcode6
08 июнь 2014, в 01:03
45 ответов
Как вы получаете длину String? Например, у меня есть переменная, определенная как: var test1: String = "Scott" Однако я не могу найти метод длины в строке.
string
04 июнь 2014, в 13:19
12 ответов
Есть ли функция, которую я могу использовать для итерации по массиву и иметь как индекс, так и элемент, например, перечисление python? for index, element in enumerate(list): ...
arrays
04 июнь 2014, в 03:05
31 ответ
Я пытаюсь разработать подходящую модель синглтон для использования в Swift. До сих пор мне удалось получить не-поточную безопасную модель, которая работает как: class var sharedInstance:TPScopeManager { get { struct Static { static var instance : TPScopeManager? = nil ...
singleton
dispatch
03 июнь 2014, в 22:36
19 ответов
В Objective C я могу использовать #pragma mark для обозначения разделов моего кода в навигаторе символов. Поскольку это команда препроцессора C, она недоступна в Swift. Есть ли в Swift возможность для этого, или мне нужно использовать уродливые комментарии?...
xcode
03 июнь 2014, в 15:06
22 ответа
Я пытаюсь создать NSTimer в Swift, но у меня проблемы. NSTimer(timeInterval: 1, target: self, selector: test(), userInfo: nil, repeats: true) test() - это функция в том же классе. Я получаю сообщение об ошибке в редакторе: Не удалось найти перегрузку для "init", которая принимает поставляемую Арг...
selector
nstimer
03 июнь 2014, в 06:48
9 ответов
В C/С++/Objective-C вы можете определить макрос, используя препроцессоры компилятора. Более того, вы можете включать/исключать некоторые части кода с помощью препроцессоров компилятора. #ifdef DEBUG // Debug-only code #endif Есть ли аналогичное решение в Swift?...
xcode
preprocessor
preprocessor-directive
02 июнь 2014, в 22:34
17 ответов
На новом языке Swift от Apple, как вы вызываете Objective-C код? Apple упомянула, что они могут сосуществовать в одном приложении, но означает ли это, что можно технически повторно использовать старые классы, сделанные в Objective-C, при создании новых классов в Swift? Рассуждение Objective-C - н...
02 июнь 2014, в 20:30
18 ответов
Приложения на основе Swift работают на OS X 10.9 (Mavericks)/iOS 7 и ниже? Например, у меня есть машина с OS X 10.8 (Mountain Lion), и мне интересно, будет ли приложение, которое я пишу в Swift, будет бегите на нем.
osx
02 июнь 2014, в 20:25
19 ответов
Как я могу обнаружить любые текстовые изменения в текстовом поле? Метод делегата shouldChangeCharactersInRange работает для чего-то, но он точно не соответствует моей потребности. Поскольку до тех пор, пока он не вернет YES, тексты textField недоступны другим методам наблюдения. например. в моем код...
event-handling
uitextfielddelegate
10 авг. 2011, в 13:25
Наверх
Меню