Spec-Zone .ru
спецификации, руководства, описания, API

Библиотека разработчика XCode

Разработчик

Используя Swift с какао и Objective C

iBook
На этой странице

Запись Swift классы с поведением Objective C

Функциональная совместимость позволяет Вам определить классы Swift, включающие поведение Objective C. Можно разделить классы Objective C на подклассы, принять протоколы Objective C и использовать в своих интересах другую функциональность Objective C при записи класса Swift. Это означает, что можно создать классы на основе знакомого, установленного поведения в Objective C и улучшить их с современными и мощными функциями языка Swift.

Наследование от классов Objective C

В Swift можно определить подклассы классов Objective C. Для создания класса Swift, наследовавшегося от класса Objective C добавьте двоеточие (:) после имени класса Swift, сопровождаемого именем класса Objective C.

Swift

  • import UIKit
  • class MySwiftViewController: UIViewController {
  • // define the class
  • }

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

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

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

Swift

  • class MySwiftViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
  • // define the class
  • }

Протоколы Objective C входят как протоколы Swift. Если Вы хотите обратиться к UITableViewDelegate протокол в Коде SWIFT, обратитесь к нему как UITableViewDelegate (по сравнению с id<UITableViewDelegate> в Objective C).

Поскольку пространство имен классов и протоколов объединено в Swift, NSObject протокол в Objective C повторно отображается на NSObjectProtocol в Swift.

Запись Initializers и Deinitializers

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

Когда Вы хотите выполнить дополнительную очистку, прежде чем Ваш класс будет освобожден, можно реализовать deninitializer вместо dealloc метод. Swift deinitializers вызывают автоматически, непосредственно перед тем, как освобождение экземпляра происходит. Swift автоматически вызывает суперкласс deinitializer после вызова deinitializer Вашего подкласса. Когда Вы работаете с классом Objective C, или Ваш класс Swift наследовался от класса Objective C, Swift вызывает суперкласс Вашего класса dealloc метод для Вас также. Можно читать больше о реализации собственного deinitializers в Deinitializers в Swift Язык программирования.

Интеграция с интерфейсным разработчиком

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

Работа с выходами и действиями

Выходы и действия позволяют Вам подключать свой исходный код к объектам пользовательского интерфейса в Интерфейсном Разработчике. Для использования выходов и действий в Swift вставить @IBOutlet или @IBAction как раз перед свойством или объявлением метода. Вы используете то же @IBOutlet атрибут для объявления набора выхода — просто указывает массив для типа.

Когда Вы объявляете выход в Swift, необходимо сделать тип выхода неявно развернутым дополнительный. Таким образом, можно позволить раскадровке соединить выходы во время выполнения после инициализации. Когда Ваш класс инициализируется от раскадровки или xib файл, можно предположить, что был соединен выход.

Например, следующий Код SWIFT объявляет класс с выходом, набором выхода и действием:

Swift

  • class MyViewController: UIViewController {
  • @IBOutlet weak var button: UIButton!
  • @IBOutlet var textFields: [UITextField]!
  • @IBAction func buttonTapped(AnyObject) {
  • println("button tapped!")
  • }
  • }

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

Живой рендеринг

Можно использовать два различных атрибута —@IBDesignable и @IBInspectable— включить живой, интерактивный пользовательский проект представления в Интерфейсном Разработчике. Когда Вы создаете пользовательское представление, наследовавшееся от UIView класс или NSView класс, можно добавить @IBDesignable атрибут как раз перед объявлением класса. После добавления пользовательского представления для Взаимодействия через интерфейс с Разработчиком (путем установки пользовательского класса представления в области инспектора), Интерфейсный Разработчик представляет представление в холсте.

Можно также добавить @IBInspectable припишите свойствам с типами, совместимыми с определяемыми пользователем атрибутами времени выполнения. После добавления пользовательского представления для Взаимодействия через интерфейс с Разработчиком, можно отредактировать эти свойства в инспекторе.

Swift

  • @IBDesignable
  • class MyCustomView: UIView {
  • @IBInspectable var textColor: UIColor
  • @IBInspectable var iconHeight: CGFloat
  • /* ... */
  • }

Указание атрибутов свойства

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

Сильный и слабый

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

Чтение-запись и Только для чтения

В Swift, существуют нет readwrite и readonly атрибуты. При объявлении сохраненного свойства использовать let сделать его только для чтения, и использование var сделать его чтением-записью. При объявлении вычисленного свойства предоставьте методу get только, чтобы сделать его только для чтения и предоставить и методу get и методу set для создания его чтением-записью. Для получения дополнительной информации посмотрите Свойства в Swift Язык программирования.

Семантика копии

В Swift, Objective C copy атрибут свойства переводит в @NSCopying. Тип свойства должен соответствовать NSCopying протокол. Для получения дополнительной информации посмотрите Атрибуты в Swift Язык программирования.

Реализация базовых подклассов управляемого объекта данных

Базовые Данные обеспечивают базовую систему хранения и реализацию свойств в подклассах NSManagedObject класс. Добавьте @NSManaged атрибут перед каждым определением свойства в Вашем подклассе управляемого объекта, соответствующем атрибуту или отношению в Вашей Базовой Модели данных. Как @dynamic атрибут в Objective C, @NSManaged атрибут сообщает компилятору Swift, что хранение и реализация свойства будут предоставлены во время выполнения. Однако в отличие от этого @dynamic, @NSManaged атрибут доступен только для Базовой Информационной поддержки.

Классы Swift являются namespaced — они ограничены по объему к модулю (обычно, проект), они компилируются в. Использовать подкласс Swift NSManagedObject класс с Вашей Базовой Моделью данных, снабдите префиксом имя класса в поле Class в образцовом инспекторе объекта с именем Вашего модуля.

image: ../Art/coredatanamespace_2x.png

Используя Swift имена классов с Objective C APIs

Классы Swift являются namespaced на основе модуля, они компилируются в, даже когда используется от кода Objective C. В отличие от Objective C, где все классы являются частью глобального пространства имен – и не должны иметь тех же классов Swift имени, может быть снят неоднозначность на основе модуля, в котором они находятся. Например, полностью определенное имя класса Swift называют DataManager в названной платформе MyFramework MyFramework.DataManager. Цель приложения Swift является самим модулем, таким образом, полностью определенное имя названного класса Swift Observer в вызванном приложении MyGreatApp MyGreatApp.Observer.

Для сохранения пространства имен, когда класс Swift используется в коде Objective C, классы Swift представлены времени выполнения Objective C с их полностью определенными именами. Поэтому, когда Вы работаете с APIs, воздействующим на строковое представление класса Swift, необходимо включать полностью определенное имя класса. Например, при создании основанного на документе приложения Mac Вы обеспечиваете имя Вашего NSDocument разделите на подклассы в своем приложении Info.plist файл. В Swift необходимо использовать полное имя подкласса документа, включая имя модуля, полученное из имени приложения или платформы.

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

Swift

  • let myPersonClass: AnyClass = NSClassFromString("MyGreatApp.Person")