Запись 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 в образцовом инспекторе объекта с именем Вашего модуля.
Используя 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")