В Swift, как можно назвать код Objective-C?
Apple упомянула, что они могут сосуществовать в одном приложении, но означает ли это, что можно технически повторно использовать старые классы, созданные в Objective-C, при создании новых классов в Swift?
objective-c
swift
Дэвид Малдер
источник
источник
Ответы:
Использование классов Objective C в Swift
Шаг 1. Добавьте реализацию Objective-C - .m
Добавьте
.m
файл в ваш класс и назовите егоCustomObject.m
.Шаг 2: Добавьте заголовок моста
При добавлении
.m
файла вы, скорее всего, получите приглашение, которое выглядит следующим образом:Нажмите Да !
Если вы не увидели подсказку или случайно удалили соединительный заголовок, добавьте новый
.h
файл в свой проект и назовите его<#YourProjectName#>-Bridging-Header.h
.В некоторых ситуациях, особенно при работе со средами Objective C, вы не добавляете класс Objective C явно, и XCode не может найти компоновщик. В этом случае создайте свой
.h
файл с именем, как указано выше, затем убедитесь, что вы связали его путь в настройках проекта вашей цели следующим образом:Замечания:
Рекомендуется связывать ваш проект с помощью
$(SRCROOT)
макроса, чтобы при перемещении проекта или работе над ним с другими с помощью удаленного репозитория он продолжал работать.$(SRCROOT)
может рассматриваться как каталог, содержащий ваш файл .xcodeproj. Это может выглядеть так:Шаг 3: Добавьте заголовок Objective C - .h
Добавьте другой
.h
файл и назовите егоCustomObject.h
.Шаг 4. Создайте свой класс Objective-C
В
CustomObject.h
В
CustomObject.m
Шаг 5: добавьте класс в Bridging-Header
В
YourProject-Bridging-Header.h
:Шаг 6: Используйте свой объект
В
SomeSwiftFile.swift
:Нет необходимости явно импортировать; это то, для чего предназначен соединительный заголовок.
Использование Swift-классов в Objective-C
Шаг 1: Создайте новый класс Swift
Добавьте
.swift
файл в ваш проект и назовите егоMySwiftObject.swift
.В
MySwiftObject.swift
:Шаг 2. Импорт файлов Swift в класс ObjC
В
SomeRandomClass.m
:Файл:
<#YourProjectName#>-Swift.h
уже должен автоматически создаваться в вашем проекте, даже если вы его не видите.Шаг 3: Используйте свой класс
Ноты:
Если завершение кода ведет себя не так, как вы ожидаете, попробуйте запустить быструю сборку, ⌘⇧Rчтобы помочь Xcode найти часть кода Objective-C из контекста Swift и наоборот.
Если вы добавляете
.swift
файл в более старый проект и получаете сообщение об ошибкеdyld: Library not loaded: @rpath/libswift_stdlib_core.dylib
, попробуйте полностью перезапустить XCode .Хотя изначально было возможно использовать чистые классы Swift (не потомки
NSObject
), которые видимы для Objective-C с помощью@objc
префикса, это больше невозможно. Теперь, чтобы быть видимым в Objective-C, объект Swift должен быть либо классом, соответствующимNSObjectProtocol
(самый простой способ сделать это наследовать отNSObject
), либо бытьenum
помеченным@objc
с необработанным значением некоторого целочисленного типа, такого какInt
. Вы можете просмотреть историю редактирования для примера использования кода Swift 1.x@objc
без этих ограничений.источник
См. Руководство Apple по использованию Swift с какао и Objective-C . В этом руководстве рассказывается, как использовать код Objective C и C из Swift и наоборот, и даются рекомендации по преобразованию проекта или смешиванию и сопоставлению частей Objective C / C и Swift в существующем проекте.
Компилятор автоматически генерирует синтаксис Swift для вызова функций C и методов Objective-C. Как видно из документации, эта Цель-C:
превращается в этот код Swift:
XCode также делает этот перевод на лету - вы можете использовать Open Quickly при редактировании файла Swift и ввести имя класса Objective-C, и это приведет вас к Swift-версии заголовка класса. (Вы также можете получить это, нажав cmd на символ API в файле Swift.) И вся справочная документация по API в библиотеках для разработчиков iOS 8 и OS X v10.10 (Yosemite) видна как в Objective-C, так и в Swift. формы (например
UIView
).источник
Ниже приведены пошаговые инструкции по использованию кода Objective-C (в данном случае, среды, предоставленной сторонней организацией) в проекте Swift:
В простых шагах:
Появится приглашение, а затем нажмите «ОК». Если оно не появится, мы создадим его вручную, как показано ниже ... Создайте один файл заголовка из источника iOS и присвойте ему имя ProjectName-Bridging-Header (пример: Test -Bridging-Header), а затем перейдите к настройке сборки в коде компилятора Swift -> Мост Objective-C добавьте имя моста Objective-C .. (Test / Test-Bridging-Header.h). Да, это завершено.
При желании удалите добавленный вами файл Objective-C (с именем «что-нибудь» на изображении GIF выше). Вам это больше не нужно.
Откройте файл заголовка моста - имя файла имеет вид [YourProject] -Bridging-Header.h . Это включает предоставленный Xcode комментарий. Добавьте строку кода для файла Objective-C, который вы хотите включить , например стороннюю платформу. Например, чтобы добавить Mixpanel в ваш проект, вам нужно добавить следующую строку кода в заголовочный файл моста:
Теперь в любом файле Swift вы можете использовать существующий код Objective-C в синтаксисе Swift (в случае этого примера, и вы можете вызывать методы Mixpanel SDK и т. Д.). Вам необходимо ознакомиться с тем, как Xcode переводит Objective-C в Swift. Руководство Apple - это краткое руководство . Или посмотрите этот ответ для неполного резюме.
Пример для Mixpanel:
Это оно!
Примечание. Если вы удалите файл заголовка моста из своего проекта , обязательно зайдите в настройки сборки и удалите значение для « Objective-C Bridging Header » в «Swift Compiler - Generation Code».
источник
Вы можете прочитать хороший пост Swift & Cocoapods . По сути, нам нужно создать файл заголовка моста и поместить туда все заголовки Objective-C. И тогда нам нужно сослаться на это из наших настроек сборки. После этого мы можем использовать код Objective-C.
Также ознакомьтесь с документом Apple « Использование Swift с какао и Objective-C» .
источник
Я написал простой проект для Xcode 6, который показывает, как смешивать код C ++, Objective-C и Swift:
https://github.com/romitagl/shared/tree/master/C-ObjC-Swift/Performance_Console
В частности, в примере вызывается функция Objective-C и C ++ из Swift .
Ключом является создание общего заголовка Project-Bridging-Header.h и размещение там заголовков Objective-C.
Пожалуйста, скачайте проект как полный пример.
источник
Я хотел бы добавить еще одну вещь:
Я очень благодарен за ответ @ Logan. Это очень помогает для создания файла моста и настроек.
Но после выполнения всех этих шагов я все еще не получаю класс Objective-C в Swift.
Я использовал
cocoapods
библиотеку и интегрировал ее в свой проект. Который естьpod "pop"
.Так что, если вы используете модули Objective-C в Swift, то есть вероятность, что вы не сможете получить
import
эти классы в Swift.Простая вещь, которую вы должны сделать, это:
<YOUR-PROJECT>-Bridging-Header
файлу и#import <ObjC_Framework>
на@import ObjC_Framework
Например: (поп-библиотека)
замещать
с
Используйте,
clang import
когда#import
не работает.источник
Цитата из документации :
источник
Просто примечание для тех, кто пытается добавить библиотеку Objective-C в Swift: Вы должны добавить -ObjC в Настройки сборки -> Связывание -> Другие флаги компоновщика .
источник
После того, как вы создали заголовок Bridging, перейдите в Build Setting => Search для «Objective-C Bridging Header».
Чуть ниже вы найдете файл "" Имя заголовка сгенерированного интерфейса Objective-C ".
Импортируйте этот файл в свой контроллер представления.
Пример: в моем случае: "Dauble-Swift.h"
источник
Нажмите на меню « Новый файл» и выберите файл, выберите язык. В это время он автоматически генерирует файл "Objective-C Bridging Header", который используется для определения некоторого имени класса.
«Заголовок моста Objective-C» в разделе «Компилятор Swift - Генерация кода».
источник
источник
Я добавил проект на GitHub, который включает в себя небольшой пример для вызова объективного кода C из Swift.
Вызовите ObjectiveC класс из Swift
источник
В проекте Swift 4.2.1 в Xcode 10.1 вы можете легко добавить файл Objective-C. Выполните следующие действия, чтобы связать файл Objective-C с проектом Swift.
Step_01: Создайте новый проект Xcode, используя язык Swift:
File
>New
>Project
>objc
.Step_02: В проект Swift добавьте новый файл Objective-C:
File
>New
>File...
>macOS
>Objective-C File
.Step_03: Если вы добавляете новый файл Objective-C в проект Swift в первый раз, Xcode спросит вас:
Would you like to configure an Objective-C bridging header
?Step_04: выберите опцию:
Create Bridging Header
,Шаг_05: Будет создан соответствующий файл с именем:
Objc-Bridging-Header.h
,Шаг_06: Теперь вам нужно настроить путь к файлу моста в заголовке моста. В Project Navigator нажмите на проект с именем
objc
и затем выберите:Build Settings
>Objective-C Bridging Header
>Objc-Bridging-Header.h
.Шаг_07: Перетащите курсор
Objc-Bridging-Header.h
в это поле, чтобы сгенерировать путь к файлу.Шаг_08: Откройте ваш
Objc-Bridging-Header.h
файл и импортируйте файл Objective-C, который вы хотите использовать в вашем файле Swift.Вот содержание
SpecialObjcFile.m
:Step_09: Теперь в вашем Swift-файле вы можете использовать класс Objective-C:
источник
Ответ Logans работает нормально, за исключением последнего,
Swift 5
он дает ошибку компилятора. Вот исправление для людей, которые работают над Swift 5.Swift 5
источник
Свифт потребитель, производитель Objective-C
Добавьте заголовок
.h
и.m
файлы реализации - файл класса какао (Objective-C),например
MyFileName
настроить заголовок моста
Когда вы видите
Would you like to configure an Objective-C bridging header
нажмите - Да<target_name>-Bridging-Header.h
будет сгенерирован автоматическиДобавить класс в Bridging-Header
In
<target_name>-Bridging-Header.h
добавить строку#import "<MyFileName>.h"
PS Если вам нужно добавить существующие файлы Objective-C в проект Swift, добавьте
Bridging-Header.h
заранееObjective-C потребитель, производитель Swift
Добавить
<MyFileName>.swift
и расширяетNSObject
Импорт файлов Swift в класс ObjC
Добавьте
#import "<#YourProjectName#>-Swift.h"
в свой файл Objective-CОтметить общедоступный код Swift [@objc and @objcMembers]
источник
В этом документе Apple предоставила официальное руководство: как-звонить-цель-c-code-from-swift
Вот соответствующая часть:
Чтобы импортировать набор файлов Objective C в код Swift в пределах одной и той же цели приложения, вы полагаетесь на файл заголовка моста Objective C, чтобы открыть эти файлы для Swift . Xcode предлагает создать этот заголовок, когда вы добавляете файл Swift в существующее приложение Objective C или файл Objective C в существующее приложение Swift.
Если вы принимаете, Xcode создает файл заголовка моста вместе с файлом, который вы создали, и присваивает ему имя, используя имя модуля вашего продукта, за которым следует «-Bridging-Header.h». Кроме того, вы можете создать мостовой заголовок самостоятельно, выбрав «Файл»> «Создать»> «Файл»> [операционная система]> «Источник»> «Заголовочный файл».
Отредактируйте соединительный заголовок, чтобы представить ваш код Objective-C вашему коду Swift:
Все общедоступные заголовки Objective-C, перечисленные в заголовке моста, видны Swift.
источник
Двухсторонний подход к использованию target-c target-c
1
2
Теперь хорошо идти Спасибо
источник