Swift и Objective C в том же проекте
Совместимость Swift с Objective C позволяет Вам создать проект, содержащий файлы, записанные на любом языке. Можно использовать эту функцию, названную смешиванием и подгонкой, для записи приложений, имеющих кодовую базу на разных языках. Используя смешивание и подгонку, можно реализовать часть функциональности приложения, использующей последние функции Swift, и беспрепятственно включить его назад в существующую кодовую базу Objective C.
Обзор смешивания и подгонки
Objective C и файлы Swift могут сосуществовать в единственном проекте, был ли проект первоначально проект Swift или Objective C. Можно просто добавить файл другого языка непосредственно к существующему проекту. Этот естественный поток операций делает создающее приложение на разных языках и цели платформы столь же прямыми как создание приложения или цели платформы записанный на единственном языке.
Процесс для работы с целями на разных языках отличается немного в зависимости от того, пишете ли Вы приложение или платформу. Общая импортная модель для работы с обоими языками в той же цели изображена ниже и описана более подробно в следующих разделах.
Импорт кода из того же приложения Target
Если Вы пишете приложение на разных языках, Вы, возможно, должны получить доступ к своему коду Objective C от Swift и своему Коду SWIFT от Objective C. Процесс, описанный в этом разделе, применяется к целям неплатформы.
Импорт Objective C в Swift
Для импорта ряда файлов Objective C в том же приложении предназначаются как Код SWIFT, Вы полагаетесь на заголовок образования моста Objective C для представления тех файлов Swift. Когда Вы добавляете файл Swift к существующему приложению Objective C или файл Objective C к существующему приложению Swift, XCode предлагает создавать этот заголовочный файл.
Если Вы принимаете, XCode создает заголовочный файл вместе с файлом, который Вы создавали, и называет его Вашим именем модуля продукта сопровождаемым путем добавления "-Bridging-Header.h"
. (Вы узнаете больше об имени модуля продукта позже в Именовании Вашего Модуля продукта.)
Также можно создать образующий мост заголовок сами путем выбора File> New> File> (iOS или OS X)> Источник> Заголовочный файл.
Необходимо будет отредактировать образующий мост заголовочный файл для представления кода Objective C Коду SWIFT.
Импортировать код Objective C в Swift от той же цели
В Вашем Objective C, соединяющем заголовочный файл мостом, импортируйте каждый заголовок Objective C, который Вы хотите представить Swift. Например:
Objective C
#import "XYZCustomCell.h"
#import "XYZCustomView.h"
#import "XYZCustomViewController.h"
При Настройках Сборки удостоверьтесь Objective C, Соединяющий установку сборки Заголовка мостом под Swift Компилятор - Генерация кода имеет путь к заголовку.
Путь должен быть относительно Вашего проекта, подобного способу, которым Ваш путь Info.plist указан в Настройках Сборки. В большинстве случаев Вы не должны должны быть изменять эту установку.
Любые общедоступные заголовки Objective C, перечисленные в этом заголовочном файле образования моста, будут видимы к Swift. Функциональность Objective C будет доступна в любом файле Swift в той цели автоматически без любых операторов импорта. Используйте свой пользовательский код Objective C с тем же синтаксисом Swift, который Вы используете с системными классами.
Swift
let myCell = XYZCustomCell()
myCell.subtitle = "A custom cell"
Импорт Swift в Objective C
При импорте Кода SWIFT в Objective C Вы полагаетесь на сгенерированный XCode заголовочный файл для представления тех файлов Objective C. Этот автоматически сгенерированный файл является заголовком Objective C, объявляющим интерфейсы Swift в Вашей цели. Это может считаться заголовком зонтика для Вашего Кода SWIFT. Имя этого заголовка является Вашим именем модуля продукта, сопровождаемым путем добавления "-Swift.h"
. (Вы узнаете больше об имени модуля продукта позже в Именовании Вашего Модуля продукта.)
По умолчанию сгенерированный заголовок содержит интерфейсы для объявлений Swift, отмеченных с public
модификатор. Это также содержит отмеченных с internal
модификатор, если Ваша цель приложения имеет заголовок образования моста Objective C. Объявления, отмеченные с private
модификатор не появляется в сгенерированном заголовке. Частные объявления не представлены Objective C, если они явно не отмечены с @IBAction
, @IBOutlet
, или @objc
также. Для получения дополнительной информации о модификаторах уровня доступа посмотрите Управление доступом в Swift Язык программирования.
Вы не должны делать, что-либо специальное для создания сгенерированного заголовочного файла — просто импортирует его для использования его содержания в коде Objective C. Обратите внимание на то, что интерфейсы Swift в сгенерированном заголовке включают ссылки на все типы Objective C, используемые в них. При использовании собственных типов Objective C в Коде SWIFT удостоверьтесь, что импортировали заголовки Objective C для тех типов прежде, чем импортировать сгенерированный заголовок Swift в Objective C .m
файл Вы хотите получить доступ к Коду SWIFT от.
Импортировать Код SWIFT в Objective C от той же цели
Импортируйте Код SWIFT из той цели в любой Objective C
.m
файл в той цели с помощью этого синтаксиса и заменяя надлежащим именем:Objective C
#import "ProductModuleName-Swift.h"
Файлы Swift в Вашей цели будут видимы в Objective C .m
файлы, содержащие этого оператора импорта. Для получения информации об использовании Swift от кода Objective C посмотрите Используя Swift от Objective C.
Импорт в Swift |
Импорт в Objective C |
|
---|---|---|
Код SWIFT |
Никакой оператор импорта |
|
Код Objective C |
Никакой оператор импорта; заголовок образования моста Objective C требуется |
|
Импорт кода из той же платформы Target
Если Вы пишете платформу на разных языках, Вы, возможно, должны получить доступ к своему коду Objective C от Swift и своему Коду SWIFT от Objective C.
Импорт Objective C в Swift
Для импорта ряда файлов Objective C в той же платформе предназначаются как Код SWIFT, необходимо будет импортировать те файлы в заголовок зонтика Objective C для платформы.
Импортировать код Objective C в Swift от той же платформы
При Настройках Сборки, в Упаковке, удостоверяются, что установка Defines Module для той цели платформы установлена в Да.
В Вашем заголовочном файле зонтика импортируйте каждый заголовок Objective C, который Вы хотите представить Swift. Например:
Objective C
#import <XYZ/XYZCustomCell.h>
#import <XYZ/XYZCustomView.h>
#import <XYZ/XYZCustomViewController.h>
Свифт будет видеть каждый заголовок, который Вы представляете публично в Вашем заголовке зонтика. Содержание файлов Objective C в той платформе будет доступно в любом файле Свифта в той цели платформы автоматически без любых операторов импорта. Используйте свой пользовательский код Objective C с тем же синтаксисом Свифта, который Вы используете с системными классами.
Swift
let myCell = XYZCustomCell()
myCell.subtitle = "A custom cell"
Импорт Swift в Objective C
Для импорта ряда файлов Swift в той же платформе предназначаются как код Objective C, Вы ничего не должны импортировать в заголовок зонтика для платформы. Вместо этого импортируйте сгенерированный XCode заголовочный файл для своего Кода SWIFT в любой Objective C .m
файл Вы хотите использовать свой Код SWIFT от.
Поскольку сгенерированный заголовок для цели платформы является частью открытого интерфейса платформы, только объявления, отмеченные с public
модификатор появляется в сгенерированном заголовке для цели платформы. Можно все еще использовать методы Swift и свойства, отмеченные с internal
модификатор из части Objective C Вашей платформы, поскольку долго они объявляются в классе, наследовавшемся от класса Objective C. Для получения дополнительной информации о модификаторах уровня доступа посмотрите Управление доступом в Swift Язык программирования.
Импортировать Код SWIFT в Objective C от той же платформы
При Настройках Сборки, в Упаковке, удостоверяются, что установка Defines Module для той цели платформы установлена в Да.
Импортируйте Код SWIFT из той цели платформы в любой Objective C
.m
файл в той цели платформы, использующей этот синтаксис и заменяющей надлежащими именами:Objective C
#import <ProductName/ProductModuleName-Swift.h>
Файлы Swift в Вашей цели платформы будут видимы в Objective C .m
файлы, содержащие этого оператора импорта. Для получения информации об использовании Swift от кода Objective C посмотрите Используя Swift от Objective C.
Импорт в Swift |
Импорт в Objective C |
|
---|---|---|
Код SWIFT |
Никакой оператор импорта |
|
Код Objective C |
Никакой оператор импорта; заголовок зонтика Objective C требуется |
|
Импорт внешних платформ
Можно импортировать внешние платформы, имеющие чистую кодовую базу Objective C, чистую кодовую базу Swift или кодовую базу на разных языках. Процесс для импорта внешней платформы является тем же, записана ли платформа на единственном языке или содержит файлы с обоих языков. То, когда Вы импортируете внешнюю платформу, удостоверьтесь, Определяет установку сборки Модуля для платформы, которую Вы импортируете, установлен в Да.
Можно импортировать платформу в любой файл Swift в различной цели с помощью следующего синтаксиса:
Swift
import FrameworkName
Можно импортировать платформу в любой Objective C .m
файл в различной цели с помощью следующего синтаксиса:
Objective C
@import FrameworkName;
Импорт в Swift |
Импорт в Objective C |
|
---|---|---|
Любая платформа языка |
|
|
Используя Swift от Objective C
Как только Вы импортируете свой Код SWIFT в Objective C, используйте регулярный синтаксис Objective C для работы с классами Swift.
Objective C
MySwiftClass *swiftObject = [[MySwiftClass alloc] init];
[swiftObject swiftMethod];
Класс Swift или протокол должны быть отмечены с @objc
атрибут, чтобы быть доступным и применимым в Objective C. Этот атрибут говорит компилятору, что к этой части Кода SWIFT можно получить доступ от Objective C. Если Ваш класс Swift является потомком класса Objective C, компилятор автоматически добавляет @objc
атрибут для Вас. Для получения дополнительной информации посмотрите Swift Соответствие типов.
У Вас будет доступ к чему-либо в классе или протоколе, это отмечено с @objc
припишите, пока это совместимо с Objective C. Это исключает функции только для Swift, такие как перечисленные здесь:
Обобщения
Кортежи
Перечисления определяются в Swift
Структуры определяются в Swift
Функции, определяемые верхнего уровня в Swift
Глобальные переменные определяются в Swift
Typealiases определяется в Swift
Стиль Swift variadics
Вложенные типы
Функции с приправой карри
Например, метод, берущий универсальный тип в качестве параметра или возвращающий кортеж, не будет применим от Objective C.
Для предотвращения циклических ссылок не импортируйте Swift в заголовочный файл Objective C. Вместо этого можно передать, объявляют, что класс Swift использует его в заголовке Objective C. Обратите внимание на то, что Вы не можете разделить класс Swift на подклассы в Objective C.
Ссылаться на класс Swift в заголовочном файле Objective C
Вперед объявите класс Swift, который Вы используете:
Objective C
// MyObjcClass.h
@class MySwiftClass;
@interface MyObjcClass : NSObject
- (MySwiftClass *)returnSwiftObject;
/* ... */
@end
Именование Вашего модуля продукта
Имя сгенерированного XCode заголовка для Кода SWIFT и имя заголовка образования моста Objective C, который XCode создает для Вас, сгенерированы с Вашего имени модуля продукта. По умолчанию Ваше имя модуля продукта совпадает с Вашим названием продукта. Однако, если Ваше название продукта имеет какие-либо неалфавитно-цифровые символы, такие как период (.
), они заменяются подчеркиванием (_
) на Ваше имя модуля продукта. Если имя начинается с числа, первое число заменяется подчеркиванием.
Можно также обеспечить пользовательское имя для имени модуля продукта, и XCode будет использовать это при именовании образования моста и сгенерированных заголовков. Чтобы сделать это, измените настройки сборки Имени Модуля продукта.
Советы по устранению неисправностей и напоминания
Обработайте свой Swift и файлы Objective C как тот же набор кода, и не упустите именование коллизий.
Если Вы работаете с платформами, удостоверьтесь, Определяет установку сборки Модуля при Упаковке, установлен в Да.
Если Вы работаете с заголовком образования моста Objective C, удостоверьтесь Objective C, Соединяющий установку сборки Заголовка мостом под Swift Компилятор - Генерация кода имеет путь к заголовку, который это относительно Вашего проекта. Путь должен быть непосредственно к самому файлу, не только к каталогу, в котором это находится.
XCode использует Ваше имя модуля продукта — не Ваше целевое имя — при именовании заголовка образования моста Objective C и сгенерированного заголовка для Кода SWIFT. Для получения информации об именовании модуля продукта посмотрите Именование Вашего Модуля продукта.
Чтобы быть доступным и применимым в Objective C, класс Swift должен быть потомком класса Objective C, или это должно быть отмечено
@objc
.При обеспечении Кода SWIFT в Objective C помните, что Objective C не будет в состоянии перевести определенные функции, которые являются определенными для Swift. Для списка посмотрите Используя Swift от Objective C.
При использовании собственных типов Objective C в Коде SWIFT удостоверьтесь, что импортировали заголовки Objective C для тех типов прежде, чем импортировать сгенерированный заголовок Swift в Objective C
.m
файл Вы хотите использовать свой Код SWIFT от.Объявления Swift, отмеченные с
private
модификатор не появляется в сгенерированном заголовке. Частные объявления не представлены Objective C, если они явно не отмечены с@IBAction
,@IBOutlet
, или@objc
также.Для целей приложения, объявления, отмеченные с
internal
если цель приложения имеет заголовок образования моста Objective C, модификатор появляется в сгенерированном заголовке.Для целей платформы, только объявления с
public
модификатор появляется в сгенерированном заголовке. Можно все еще использовать методы Swift и свойства, отмеченные сinternal
модификатор из части Objective C Вашей платформы, поскольку долго они объявляются в классе, наследовавшемся от класса Objective C. Для получения дополнительной информации о модификаторах уровня доступа посмотрите Управление доступом в Swift Язык программирования.