Swift foundation что это

Обновлено: 15.05.2024

В чем разница между import Swift и import Foundation ?

Пока я не прочитал этот комментарий от Martin R , я даже не знал, что существует import Swift .

Я не смог найти документацию, и поиск в Google не принес особого успеха.

Что я пробовал

Проверка показывает, что import Swift не выдает ошибок компиляции, но это не совсем ответ на мой вопрос.

Если бы я догадывался, я бы сказал, что вы импортируете Swift для проектов Swift и что вы импортируете проекты Foundation для Objective-C или, может быть, для проектов Swift, которые используют классы Objective-C (например, NSString ).

Тестирование на игровой площадке:

Комментирование import Swift не дает ошибок, а str имеет тип String . Однако комментирование import Foundation дает ошибку "необъявленный тип" для NSString .

Повторный ответ на мой вопрос

Я был бы достаточно счастлив отказаться от Foundation и просто использовать Swift. Итак, я прав, просто постоянно импортируя Swift, если мне не нужно специально использовать один из старых классов Objective-C?

Магазины

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

The powerful programming language that is also easy to learn.

Swift is a powerful and intuitive programming language for iOS, iPadOS, macOS, tvOS, and watchOS. Writing Swift code is interactive and fun, the syntax is concise yet expressive, and Swift includes modern features developers love. Swift code is safe by design, yet also produces software that runs lightning-fast.

Open Source

Cross Platform

Swift already supports all Apple platforms and Linux, with community members actively working to port to even more platforms. With SourceKit-LSP, the community is also working to integrate Swift support into a wide-variety of developer tools. We’re excited to see more ways in which Swift makes software safer and faster, while also making programming more fun.

Swift for Server

While Swift powers many new apps on Apple platforms, it’s also being used for a new class of modern server applications. Swift is perfect for use in server apps that need runtime safety, compiled performance and a small memory footprint. To steer the direction of Swift for developing and deploying server applications, the community formed the Swift Server work group. The first product of this effort was SwiftNIO, a cross-platform asynchronous event-driven network application framework for high performance protocol servers and clients. It serves as the foundation for building additional server-oriented tools and technologies, including logging, metrics and database drivers which are all in active development.

Практика, Практика, Практика

Изучение нового навыка лучше всего делать на практике. Давайте начнем с создания новой игровой площадки в Xcode. Назовите игровую площадку Foundation и установите Platform на iOS . Нажмите Далее, чтобы продолжить. Сообщите Xcode, где вы хотите сохранить игровую площадку, и нажмите « Создать» .

Создание новой игровой площадки

Вот как должно выглядеть содержимое детской площадки.

Детская площадка содержит комментарий вверху, оператор импорта для инфраструктуры UIKit и объявление переменной. Справа вы можете увидеть выход игровой площадки.

Поскольку мы будем работать с платформой Foundation, нам нужно заменить оператор импорта для UIKit на оператор импорта для Foundation. Удалите комментарий вверху, обновите оператор импорта и удалите объявление переменной.

Фреймворк Foundation — это нечто большее, чем набор классов для работы с числами, строками и коллекциями (массивами, словарями и наборами). Он также определяет десятки протоколов, функций, типов данных и констант.

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

протоколы

Несколько языков, таких как Perl, Python и C ++, обеспечивают поддержку множественного наследования . Это означает, что класс может происходить из подкласса более чем одного класса.

Хотя Swift и Objective-C не предоставляют поддержку множественного наследования, они поддерживают множественное наследование посредством спецификации в форме протоколов. Мы уже рассматривали протоколы ранее в этой серии, но есть важная деталь, которую мы еще не обсуждали.

Необязательные и обязательные методы

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

Поскольку подавляющее большинство платформ iOS SDK написано на Objective-C, мы встретимся с рядом протоколов Objective-C, которые определяют дополнительные методы. Важно помнить, что требуется каждое свойство и метод протокола Swift.

Преимущества

Преимущества протоколов многообразны. Когда класс принимает или соответствует протоколу, ожидается, что класс реализует методы, объявленные протоколом. Для некоторых из вас протоколы могут напоминать интерфейсы в Java. Это означает, что протокол может использоваться для объявления интерфейса с объектом без раскрытия типа объекта.

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

NSObject

В дополнение к корневому классу NSObject платформа Foundation также определяет протокол NSObject . Однако в Swift классы и протоколы не могут иметь одинаковые имена. В результате протокол NSObject известен как NSObjectProtocol в Swift.

Объекты, соответствующие протоколу NSObjectProtocol , могут спрашивать об их классе и суперклассе, могут сравниваться с другими объектами и отвечать на self . Это лишь небольшая часть поведения, добавляемого к объектам, соответствующим протоколу NSObjectProtocol .

NSCoding

Объекты, соответствующие протоколу NSCoding , могут быть закодированы и декодированы. Это необходимо для объектов, которые необходимо архивировать или распространять. Архивирование объекта, например, происходит, когда объект или граф объекта сохраняются на диске.

NSCopying

Классы

NSObject

Класс NSObject является корневым классом подавляющего большинства иерархий классов Objective-C. Почему это важно, если мы заинтересованы в Swift? Помните, что большинство платформ iOS SDK работают на Objective-C. Даже если вы решите разработать приложение на Swift, вы все равно будете использовать Objective-C под капотом.

Унаследовавшись от корневого класса NSObject , объекты знают, как вести себя как объекты Objective C и как взаимодействовать со средой выполнения Objective C. Не должно быть сюрпризом, что NSObject соответствует протоколу NSObject/NSObjectProtocol , который мы обсуждали несколько минут назад.

Давайте посмотрим, что мы получим бесплатно, если класс наследуется от класса NSObject . Добавьте следующий фрагмент кода на свою игровую площадку. Это должно выглядеть знакомо, если вы читали предыдущие статьи этой серии. Мы объявляем класс Book , который наследуется от NSObject . Класс Book реализует два метода экземпляра, chapters() и pages() .

Поскольку Book наследуется от NSObject а NSObject соответствует протоколу NSObjectProtocol , мы можем спросить класс Book о его поведении и дереве наследования. Посмотрите на следующий пример.

Осматривая Книжный Класс

Сначала мы спрашиваем класс Book о себе, вызывая classForCoder() для класса Book . Метод classForCoder() является методом класса, что означает, что мы можем вызвать этот метод для самого класса Book . Затем мы спрашиваем класс Book о его суперклассе или родительском классе, классе, от которого он напрямую наследует. Это возвращает необязательный, так как не каждый класс имеет родительский класс. Неудивительно, что суперклассом Book является NSObject .

Следующая строка говорит нам, что Book соответствует протоколу NSObjectProtocol , что не является неожиданностью, поскольку оно наследует эту черту от класса NSObject . Мы также узнаем, что Book не соответствует протоколу NSCoding .

Похоже, что класс Book не отвечает на метод chapters() . Это не так уж странно, поскольку chapters() является методом экземпляра, а не методом класса. Это подтверждается последними двумя строками нашего примера, в которых мы создаем экземпляр экземпляра Book и задаем ему тот же вопрос.

NSNumber

Класс NSNumber — это служебный класс, который управляет любым из базовых числовых типов данных. Это подкласс класса NSValue , который предоставляет объектно-ориентированную оболочку для скалярных типов, указателей, структур и идентификаторов объектов. Класс NSNumber определяет методы для извлечения значения, которое он хранит, для сравнения значений, а также для возврата строкового представления сохраненного значения.

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

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

Работа с классом NSNumber

Мы создаем новый экземпляр NSNumber , передав значение Double в init(double:) . Затем мы запрашиваем хранимое значение, используя три разных метода NSNumber . Как видите, результаты не всегда отражают значение, хранящееся в myNumber .

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

NSString

Экземпляры класса NSString управляют массивом символов unichar образующих строку текста. Тонкое, но важное отличие обычной строки C, которая управляет символами char , заключается в том, что символ unichar является многобайтовым символом. Это похоже на String тип Swift.

Как следует из его названия, символ unichar идеально подходит для обработки символов Unicode. Благодаря этой реализации класс NSString обеспечивает NSString поддержку интернационализации.

Я хочу подчеркнуть, что строка, управляемая экземпляром NSString является неизменной. Это означает, что после создания строки ее нельзя изменить. Разработчики из других языков, таких как PHP, Ruby или JavaScript, могут быть смущены этим поведением.

Платформа Foundation также определяет изменяемый подкласс NSString , NSMutableString , который можно изменить после инициализации.

Существуют различные способы создания строковых объектов. Самый простой способ создать строковый объект — вызвать метод string() в классе NSString . Это возвращает пустой строковый объект. Посмотрите на ссылку на класс NSString для полного списка инициализаторов.

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

Создание строк в Swift

Обратите внимание, что мы не полагаемся на вывод типа Swift для определения типа stringA . Второй пример, stringB , показывает, почему это так. Если мы явно не указываем тип stringA как NSString , Swift думает, что мы хотим создать экземпляр String . В примере также показано, что NSString наследует от NSObject а String — нет. Помните, что тип String в Swift — это структура, а структуры не поддерживают наследование.

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

Давайте исследуем NSString и его изменяемый подкласс NSMutableString , добавив следующий фрагмент к вашей игровой площадке.

Модель Модель-Вид-Контроллер

Прежде чем мы начнем исследовать инфраструктуру UIKit, я хочу поговорить о шаблоне Model-View-Controller (MVC). Шаблон MVC является одним из самых распространенных шаблонов в объектно-ориентированном программировании. Он способствует повторному использованию кода и имеет тесные связи с концепцией разделения обязанностей или интересов. Одной из основных целей шаблона MVC является отделение бизнес-логики приложения от уровня представления.

Cocoa Touch охватывает шаблон MVC, что означает, что важно понимать, что это такое и как оно работает. Другими словами, благодаря пониманию шаблона MVC будет гораздо легче понять, как различные компоненты приложения iOS работают вместе.

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

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

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

Новое начало

Запустите Xcode и создайте новый проект, выбрав New> Project … в меню File . В разделе iOS слева выберите категорию приложений . Из списка шаблонов проектов выберите шаблон приложения Single View .

Шаблон приложения Single View содержит основные строительные блоки приложения для iOS, что делает его хорошим местом для начала нашего путешествия.

Выбор шаблона проекта

Назовите проект FirstSteps и введите название и идентификатор организации. Установите язык на Swift и установите устройства на iPhone . Оставьте флажки внизу непроверенными.

Конфигурирование проекта

Сообщите Xcode, где вы хотите сохранить новый проект, и убедитесь, что проект находится под контролем версий, установив флажок « Создать репозиторий Git на моем Mac» . Пересмотрите эту статью для получения дополнительной информации о контроле версий и его преимуществах.

Сохранение проекта

Source and Binary Compatibility

With Swift 5, you don’t have to modify any of your Swift 4 code to use the new version of the compiler. Instead you can start using the new compiler and migrate at your own pace, taking advantage of new Swift 5 features, one module at a time. And Swift 5 now introduces binary compatibility for apps. That means you no longer need to include Swift libraries in apps that target current and future OS releases, because the Swift libraries will be included in every OS release going forward. Your apps will leverage the latest version of the library in the OS, and your code will continue to run without recompiling. This not only makes developing your app simpler, it also reduces the size of your app and its launch time.

Get Started

Download Xcode and learn how to build apps using Swift with documentation and sample code.

Playgrounds and Read-Eval-Print-Loop (REPL)

Much like Swift Playgrounds for iPad, playgrounds in Xcode make writing Swift code incredibly simple and fun. Type a line of code and the result appears immediately. You can then Quick Look the result from the side of your code, or pin that result directly below. The result view can display graphics, lists of results, or graphs of a value over time. You can open the Timeline Assistant to watch a complex view evolve and animate, great for experimenting with new UI code, or to play an animated SpriteKit scene as you code it. When you’ve perfected your code in the playground, simply move that code into your project. Swift is also interactive when you use it in Terminal or within Xcode’s LLDB debugging console. Use Swift syntax to evaluate and interact with your running app, or write new code to see how it works in a script-like environment.

iOS с нуля с Swift: первые шаги с UIKit

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

Файлы и папки

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

В Навигаторе проекта вы должны увидеть две папки в корне проекта:

  • Товары
  • папка с именем вашего проекта, FirstSteps в этом примере

Давайте посмотрим на содержимое каждой из этих папок.

Структура проекта

Товары

Папка « Продукты » в настоящее время содержит один элемент. Он носит название проекта и имеет расширение .app . Папка « Продукты » содержит приложение или приложения, созданные проектом после компиляции исходного кода.

Вы заметили, что FirstSteps .app выделен красным? Всякий раз, когда Xcode не может найти файл, он выделяет файл красным цветом. Не беспокойся, хотя. Поскольку проект еще не скомпилирован, Xcode еще не создал продукт.

Папка проекта

Большая часть вашего времени проводится в папке проекта, которая в настоящее время содержит шесть файлов. Первые два файла, AppDelegate.swift и ViewController .swift , являются исходными файлами. Эти файлы содержат исходный код приложения.

Main.storyboard содержит пользовательский интерфейс приложения. Мы уже работали с раскадровками ранее в этой серии. Обратите внимание, что есть вторая раскадровка, LaunchScreen.storyboard . Эта раскадровка используется операционной системой при запуске приложения. Вместо того чтобы показывать пустое представление, операционная система использует эту раскадровку для динамического создания образа запуска, который отображается пользователю при загрузке приложения.

Info.plist , обычно называемый файлом проекта «info-dot-plist», представляет собой список свойств, который содержит различные параметры конфигурации. Большинство этих параметров также можно изменить, выбрав проект в Навигаторе проектов , выбрав цель в списке « Цели» и открыв вкладки « Общие» , « Возможности» и « Информация» .

Assets.xcassets — это специальный тип папки для хранения ресурсов вашего проекта, таких как изображения.

Great First Language

Swift can open doors to the world of coding. In fact, it was designed to be anyone’s first programming language, whether you’re still in school or exploring new career paths. For educators, Apple created free curriculum to teach Swift both in and out of the classroom. First-time coders can download Swift Playgrounds—an app for iPad that makes getting started with Swift code interactive and fun.

Aspiring app developers can access free courses to learn to build their first apps in Xcode. And Apple Stores around the world host Today at Apple Coding & Apps sessions where you can get hands-on experience with Swift code.

UIApplication

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

Когда приложение запускается, создается синглтон этого класса. Вы помните, что такое одноэлементный объект ? Это означает, что в течение времени жизни приложения создается только один экземпляр UIApplication класса UIApplication .

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

В приложениях iOS с экземпляром UIApplication связан объект делегата. Всякий раз, когда вы создаете проект iOS, используя один из предоставленных шаблонов, XCode создаст класс делегата приложения для вас. Посмотрите на имена исходных файлов в папке проекта в Project Navigator . Первый файл называется AppDelegate.swift .

Экземпляр этого класса является делегатом синглтона UIApplication . Прежде чем более детально взглянуть на класс AppDelegate , нам нужно понять, что такое шаблон делегата.

Оле Бегеманн написал отличную статью о последовательности запуска типичного приложения для iOS. В своей статье Оле рассказывает о различных задействованных компонентах и ​​их роли во время запуска приложения. Я настоятельно рекомендую прочитать эту статью, если вы хотите лучше понять роль класса UIApplication .

UIView

Даже если ваше приложение может иметь только один экземпляр UIWindow , оно может иметь много представлений. Класс UIView является важным компонентом инфраструктуры UIKit, поскольку многие классы наследуют его — прямо или косвенно.

Пересмотрите Main.storyboard , выбрав его, и посмотрите на библиотеку объектов в нижней части инспектора .

Просмотр библиотеки объектов

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

Добавление метки и кнопки на раскадровку

Обратите внимание, что два новых объекта были добавлены в раздел « Объекты » слева. И метка ( UILabel ), и кнопка ( UIButton ) наследуются от UIView . Вы заметили, что объекты Label и Button имеют небольшой отступ по сравнению с объектом View ? Это указывает на то, что объекты Label и Button являются подпредставлениями объекта View . Представление может иметь одно или несколько подпредставлений, которыми оно управляет.

Как я упоминал ранее, класс UIView является важным компонентом UIKit. Представление управляет прямоугольной областью или рамкой на экране. Он управляет содержимым области, подпредставлениями и любым взаимодействием с содержимым представления. Класс UIView является подклассом UIResponder . Вы узнаете намного больше о взглядах в течение этой серии.

iOS с нуля с помощью Swift: изучение Foundation Framework

Основа Framework — это хлеб с маслом в наборе инструментов разработчика iOS. Он предоставляет корневой класс NSObject и большое количество фундаментальных строительных блоков для разработки под iOS, от классов для чисел и строк до массивов и словарей. Вначале платформа Foundation может показаться немного скучной, но она использует много энергии и является незаменимой для разработки приложений для iOS.

UIViewController

Если вы откроете ViewController.swift , вы заметите, что класс ViewController является подклассом UIViewController . Как и AppDelegate , класс UIViewController является подклассом UIResponder . Контроллеры представления или их подклассы попадают в категорию контроллеров шаблона MVC. Как следует из названия, они управляют представлением, экземпляром класса UIView , который принадлежит категории представления шаблона MVC.

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

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

Контроллер вида имеет ссылку на свой вид

В Инспекторе соединений вы должны увидеть раздел « Розетки» . Термин «аутлет» — это модное слово для свойства, которое вы можете установить в раскадровке. Наведите указатель мыши на розетку с именем view и посмотрите, как подсвечивается вид в рабочей области. Это связь между контроллером представления и представлением.

Компоненты приложения

Теперь, когда мы знаем, для чего предназначены различные файлы и папки в нашем проекте, пришло время изучить различные компоненты приложения для iOS. Продолжая наше путешествие, мы столкнемся с несколькими классами, которые принадлежат UIKit. Каждый класс, принадлежащий платформе UIKit, начинается с префикса класса UI . Помните, что базовые классы имеют префикс NS .

Fast and Powerful

From its earliest conception, Swift was built to be fast. Using the incredibly high-performance LLVM compiler technology, Swift code is transformed into optimized native code that gets the most out of modern hardware. The syntax and standard library have also been tuned to make the most obvious way to write your code also perform the best whether it runs in the watch on your wrist or across a cluster of servers.

Swift is a successor to both the C and Objective-C languages. It includes low-level primitives such as types, flow control, and operators. It also provides object-oriented features such as classes, protocols, and generics, giving Cocoa and Cocoa Touch developers the performance and power they demand.

Objective-C Interoperability

You can create an entirely new application with Swift today, or begin using Swift code to implement new features and functionality in your app. Swift code co-exists along side your existing Objective-C files in the same project, with full access to your Objective-C API, making it easy to adopt.

Слово о базовом фонде

В предыдущей статье я кратко упомянул Core Foundation и его связь с Foundation. Несмотря на то, что мы не будем явно использовать платформу Core Foundation в оставшейся части этой серии, полезно ознакомиться с этой платформой и узнать, чем она отличается от ее объектно-ориентированного элемента, Foundation, который вы будете широко использовать.

В то время как платформа Foundation реализована в Objective-C, платформа Core Foundation основана на языке C. Несмотря на это различие, платформа Core Foundation реализует ограниченную объектную модель. Эта объектная модель позволяет определять набор непрозрачных типов, которые часто называют объектами, несмотря на то, что они, строго говоря, не являются объектами.

Основная цель обеих платформ схожа, позволяя обмениваться данными и кодом между различными библиотеками и платформами. Базовый фонд также включает поддержку интернационализации. Ключевой компонент этой поддержки предоставляется через непрозрачный тип CFString , который эффективно управляет массивом символов Unicode .

Как я уже упоминал ранее, мост по бесплатному соединению буквально сокращает разрыв между обеими платформами, позволяя заменять объекты Какао на Базовые объекты Основы в параметрах функций и наоборот.

Важно отметить, что автоматический подсчет ссылок (ARC) не управляет «объектами» Core Foundation. Это означает, что вы несете ответственность за управление памятью при работе с Core Foundation. Майк Эш написал отличную статью об автоматическом подсчете ссылок и о том, как использовать ARC с Core Foundation и бесплатными мостами.

Посетите справочник по базовой платформе Apple Core Foundation, если вы хотите узнать больше о платформе и получить полный список непрозрачных типов платформы.

Что такое UIKit Framework?

В то время как платформа Foundation определяет классы, протоколы и функции для разработки под iOS и OS X, платформа UIKit предназначена исключительно для разработки под iOS. Это эквивалент Application Kit или платформы AppKit для разработки под OS X.

Как и Foundation, UIKit определяет классы, протоколы, функции, типы данных и константы. Он также добавляет дополнительные функциональные возможности к различным NSValue классам, таким как NSObject , NSString и NSValue благодаря использованию категорий Objective-C.

Категории Objective C — удобный способ добавить дополнительные методы к существующим классам без необходимости создавать подклассы. Они похожи на расширения Swift. Прочтите этот урок от Аарона Крабтри, если вы хотите узнать больше о категориях Objective-C.

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

Designed for Safety

Swift eliminates entire classes of unsafe code. Variables are always initialized before use, arrays and integers are checked for overflow, memory is automatically managed, and enforcement of exclusive access to memory guards against many programming mistakes. Syntax is tuned to make it easy to define your intent — for example, simple three-character keywords define a variable ( var ) or constant ( let ). And Swift heavily leverages value types, especially for commonly used types like Arrays and Dictionaries. This means that when you make a copy of something with that type, you know it won’t be modified elsewhere.

Another safety feature is that by default Swift objects can never be nil . In fact, the Swift compiler will stop you from trying to make or use a nil object with a compile-time error. This makes writing code much cleaner and safer, and prevents a huge category of runtime crashes in your apps. However, there are cases where nil is valid and appropriate. For these situations Swift has an innovative feature known as optionals. An optional may contain nil , but Swift syntax forces you to safely deal with it using the ? syntax to indicate to the compiler you understand the behavior and will handle it safely.

Use optionals when you might have an instance to return from a function, or you might not.

Features such as optional binding, optional chaining, and nil coalescing let you work safely and efficiently with optional values.

Раскадровка

Проект Xcode содержит еще один интересный файл, Main.storyboard . Раскадровка определяет, как выглядит пользовательский интерфейс вашего приложения. По умолчанию раскадровка называется Main.storyboard . Выберите раскадровку, чтобы открыть ее.

Главный раскадровка проекта

В настоящее время раскадровка содержит один вид в центральной рабочей области. Справа от Project Navigator вы можете увидеть список элементов, которые являются объектами, которые вы видите в представлении. Верхний элемент View Scene Scene содержит один дочерний элемент View Controller .

Объект View Controller также имеет несколько дочерних элементов, но есть один, который представляет для нас особый интерес, объект с именем View . Помните обсуждение о шаблоне MVC. Теперь вы можете увидеть шаблон MVC в действии. В данный момент модель отсутствует, но у нас есть представление, объект View и контроллер, объект View Controller .

Когда приложение запускается, раскадровка используется для создания пользовательского интерфейса приложения. Контроллер представления автоматически создается, как и представление контроллера представления. Объект View в раскадровке управляется контроллером представления.

Подожди минуту. Где я могу найти класс контроллера представления в раскадровке? Как я могу изменить его поведение, чтобы создать уникальное приложение? Выберите объект View Controller слева и откройте Identity Inspector справа.

Класс Контроллера Представления

Инспектор личных данных расскажет вам все, что вам нужно знать. Вверху, в разделе Custom Class , вы можете увидеть имя класса контроллера представления, ViewController . Вы заметили, что файл, о котором мы еще не говорили, носит то же имя? Мы рассмотрим этот файл через несколько минут.

Контроллер представления создан для нас, потому что это начальный контроллер представления раскадровки. Это указано в раскадровке стрелкой, указывающей на сцену View Controller .

Стрелка указывает на начальный вид контроллера раскадровки

Swift

Modern

Swift is the result of the latest research on programming languages, combined with decades of experience building Apple platforms. Named parameters are expressed in a clean syntax that makes APIs in Swift even easier to read and maintain. Even better, you don’t even need to type semi-colons. Inferred types make code cleaner and less prone to mistakes, while modules eliminate headers and provide namespaces. To best support international languages and emoji, Strings are Unicode-correct and use a UTF-8 based encoding to optimize performance for a wide-variety of use cases. Memory is managed automatically using tight, deterministic reference counting, keeping memory usage to a minimum without the overhead of garbage collection.

Declare new types with modern, straightforward syntax. Provide default values for instance properties and define custom initializers.

Add functionality to existing types using extensions, and cut down on boilerplate with custom string interpolations.

Quickly extend your custom types to take advantage of powerful language features, such as automatic JSON encoding and decoding.

Perform powerful custom transformations using streamlined closures.

These forward-thinking concepts result in a language that is fun and easy to use.

Swift has many other features to make your code more expressive:

  • Generics that are powerful and simple to use
  • Protocol extensions that make writing generic code even easier
  • First class functions and a lightweight closure syntax
  • Fast and concise iteration over a range or collection
  • Tuples and multiple return values
  • Structs that support methods, extensions, and protocols
  • Enums can have payloads and support pattern matching
  • Functional programming patterns, e.g., map and filter
  • Native error handling using try / catch / throw

3 ответа

Да, вам понадобится import Foundation , только если вы хотите получить доступ к NSObject или одному из его подклассов. Основа - это структура, которая привносит эту иерархию классов. Однако весьма вероятно, что в проекте вам понадобится нечто большее, чем просто import Swift . Как прокомментировал Роб, import UIKit тоже хороший вариант.

Если вы еще не читали, Apple объясняет структуру Foundation здесь.

import Foundation используется для доступа к NSObject или одному из его подклассов. NSObject означает, что мы можем расширить наш класс с помощью функций времени выполнения objective C . Но импортировать UIKit или импортировать swift, что выполняется автоматически генерировать, пока мы создаем наш проект xcode

Если вы хотите работать с строками, датами и т. Д. Вам нужно импортировать фонд.

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

Если вы хотите работать с UITableViewController, UIAlertController вам необходимо импортировать UIKit.

Если вы импортируете UIKit, вам не нужно импортировать Foundation, потому что он уже импортирует его за кулисами.

Стандартная библиотека Swift определяет базовый уровень функциональности для написания программ Swift, включая:

Основные типы данных, общие структуры данных, глобальные функции, такие как print (: separator: terminator :) и abs ( :), протоколы, такие как Collection и Equatable . и т. Д.

Если вы импортируете Foundation, нет необходимости повторно импортировать Swift, поскольку Foundation по умолчанию содержит ссылки на стандартную библиотеку Swift.

Когда вы пишете что-то не для приложений iOS, например, серверное программирование на основе Vapor, вам может потребоваться импорт Swift.

Package Manager

Swift Package Manager is a single cross-platform tool for building, running, testing and packaging your Swift libraries and executables. Swift packages are the best way to distribute libraries and source code to the Swift community. Configuration of packages is written in Swift itself, making it easy to configure targets, declare products and manage package dependencies. New to Swift 5, the swift run command now includes the ability to import libraries in a REPL without needing to build an executable. Swift Package Manager itself is actually built with Swift and included in the Swift open source project as a package.

Шаблон делегата

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

Как и шаблон MVC, делегирование является распространенным в объектно-ориентированном программировании. Шаблон делегата в Cocoa Touch, однако, немного отличается, поскольку он использует протокол делегата для определения поведения объекта делегата.

Давайте прыгнем вперед и посмотрим на таблицы. Если вы провели какое-то время с iPhone или iPad, то класс UITableView должен быть вам знаком. Он представляет упорядоченный список данных пользователю, и он делает эту работу очень хорошо.

Как табличное представление знает, что делать, когда постукивают по строке? Это поведение включено в класс UITableView ? Конечно, нет, потому что это поведение варьируется от приложения к приложению. Если бы мы включили это поведение в класс UITableView , его нельзя было бы использовать повторно.

Табличное представление передает эту ответственность на объект делегата. Иными словами, он делегирует эту задачу другому объекту, объекту делегата . Потратьте немного времени, чтобы проверить ссылку на класс класса UITableView . У этого есть два свойства, названные dataSource и delegate . delegate уведомляется табличным представлением, когда пользователь касается строки. Ответственность за это событие касания несет объект-делегат.

Теперь, когда мы знаем, что такое делегирование, пришло время изучить созданный для нас класс AppDelegate Xcode. При запуске приложения приложение создает экземпляр класса AppDelegate . Этот экземпляр AppDelegate затем устанавливается как делегат экземпляра UIApplication операционной системы, созданной для вашего приложения. Вы никогда явно не создаете экземпляр объекта делегата приложения.

Откройте AppDelegate.swift, чтобы проверить реализацию класса AppDelegate . Игнорируя комментарии вверху, первая строка импортирует UIKit-фреймворк, чтобы мы могли работать с его классами и протоколами.

На следующей строке мы видим что-то, что мы еще не рассмотрели, атрибут. Атрибуты в Swift начинаются с символа @ и могут рассматриваться как инструкции для компилятора. @UIApplicationMain сообщает компилятору, что AppDelegate — это класс, который должен использоваться в качестве делегата приложения. Это все, что вам нужно знать об этом атрибуте на данный момент.

Следующая строка должна выглядеть знакомо. Это начало объявления класса AppDelegate . Он указывает имя класса и родительский класс класса, UIResponder .

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

class AppDelegate: UIResponder, UIApplicationDelegate <

Следующая строка является объявлением свойства для свойства window . Обратите внимание, что свойство является переменной типа UIWindow? , Класс UIWindow является подклассом UIView , базового класса для представлений на iOS.

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

Протокол определяет десятки методов, и я рекомендую вам изучить некоторые из них, чтобы получить представление о возможностях протокола. На данный момент наиболее интересным для нас является метод application(_:didFinishLaunchingWithOptions:) .

Когда объект UIApplication завершил подготовку приложения к запуску, он уведомляет своего делегата, объект AppDelegate , о том, что приложение собирается запустить.

Почему он уведомляет делегата приложения об этом событии? Экземпляр UIApplication уведомляет своего делегата об этом событии, чтобы у него была возможность подготовиться к запуску приложения. Реализация application(_:didFinishLaunchingWithOptions:) довольно коротка, как вы можете видеть ниже.

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool < // Override point for customization after application launch.

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

Читайте также: