Как я могу импортировать код Swift в Objective-C?

281

Я написал библиотеку на Swift и не смог импортировать ее в свой текущий проект, написанный на Objective-C.

Есть ли способы его импортировать?

#import "SCLAlertView.swift" - 'SCLAlertView.swift' file not found
Виктор Радченко
источник
9
люблю этот проект!
SleepsOnNewspapers

Ответы:

430

Вам нужно импортировать TargetName-Swift.h. Обратите внимание, что это целевое имя - другие ответы делают ошибку при использовании имени класса.

Этот единственный файл является автоматически сгенерированным заголовком, который определяет интерфейсы Objective C для всех классов Swift в вашем проекте, которые либо аннотированы, @objcлибо наследуются от них NSObject.

Соображения:

  • Если ваше целевое имя содержит пробелы, замените их подчеркиванием (например, My Projectстановится My_Project-Swift.h)

  • Если ваша цель - фреймворк, вам нужно импортировать <TargetName/TargetName-Swift.h>

  • Убедитесь, что ваш файл Swift является членом цели

Билл
источник
5
Обратите внимание, что если вы попытаетесь использовать имя файла Swift при импорте, вы получите сообщение об ошибке «Ожидается»; после декларатора верхнего уровня ". в вашем файле Swift после «импорта основы».
Луи Луи
8
РЕДАКТИРОВАТЬ: Примечание: чтобы это работало, имя модуля проекта ДОЛЖНО быть определено. См .: stackoverflow.com/a/24064015/2085743
Рубен Мартинес-младший
7
Я просто хотел бы добавить примечание, что если в названии вашего проекта есть пробелы или специальные символы, вы должны заменить их подчеркиванием, например «My App» будет «My_App-Swift.h»
Hola Soy Edu Feliz Navidad
84
Почему это так сложно и плохо документировано?
Учуугака
3
@lelelo Нет, этот файл противоположен этому. Заголовок моста написан разработчиком и позволяет вам добавлять символы Objective-C и C в ваш код Swift. Файл Target-Swift.h генерируется автоматически и позволяет вашему коду Objective-C / C получать доступ к символам Swift.
Билл
154

Инструкции с сайта Apple:

Чтобы импортировать код Swift в Objective-C из того же фреймворка

В разделе параметров сборки , в упаковке , убедитесь , что Определяет модуль настройка для этой цели рамочной установлена в Yes . Импортируйте код Swift из этой целевой платформы в любой файл Objective-C .m в этой целевой структуре, используя этот синтаксис и подставляя соответствующие имена:

#import "ProductName-Swift.h"

Редакция:

Вы можете импортировать «ProductName-Swift.h» только в файлы .m.

Файлы Swift в вашей цели будут видны в файлах Objective-C .m, содержащих этот оператор импорта.

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

введите описание изображения здесь

Андрей Папанча
источник
2
Помог только импорт "ProductName-Swift.h" в .m файлы. Добавление того же в файл .pch выдает: «Не удается найти объявление протокола для« CLLocationManagerDelegate »; вы имели в виду« NSLayoutManagerDelegate »?»
Альфонс Р. Дсуза,
@ А это не напрямую, в документации это сказано. Самый простой способ - создать класс Objective-C, который переводится в формат, понятный Objective-C ++. developer.apple.com/library/ios/documentation/Swift/Conceptual/…
Алехандро Иван
1
Обратите внимание, что вы должны извлечь из NSObject!!! Вы не можете просто объявить class Blah в быстром и заставить его работать. это должно бытьclass Blah : NSObject
Дэвид Т.
В некоторых случаях стоит прочитать этот ответ: stackoverflow.com/questions/26328034/… В зависимости от того, что вы делаете: #import <ProductName / ProductModuleName-Swift.h> #import <ProductModuleName-Swift.h> #import <NewTestApp / NewTestApp -Swift.h>
inigo333
Что если вы хотите импортировать расширение Swift?
Рикардо
150

Вот что нужно сделать:

  1. Создать новый проект в Objective-C

  2. Создать новый .swiftфайл  

    • Появится всплывающее окно с вопросом «Хотите ли вы настроить заголовок моста Objective C» ?
    • Выберите Да .
  3. Нажмите на свой файл проекта XCode

  4. Нажмите на настройки сборки

  5. Найдите панель поиска и найдите модуль Defines .

  6. Измените значение на Да .

  7. Поиск по названию модуля продукта .

  8. Измените значение на имя вашего проекта.

  9. В App делегат добавьте следующее: #import "YourProjectName-Swift.h"


Примечание: всякий раз, когда вы хотите использовать свой файл Swift, вы должны импортировать следующую строку:

#import "YourProjectName-Swift.h"

Sumit Singh
источник
1
Изменение значения Defines moduleв Build settingsк Yesто , что фиксированные вещи для меня!
Закария Бракса
Встроенный контент содержит Swift: ДА ИСПОЛЬЗУЙТЕ это также
Mohit
4
хороший ответ, но шаги 7-8 не нужны в Xcode 7.3.1 и выше
Sam B
Работал на меня! Спасибо.
itdamslife
1
Просто хочу добавить, что YourProjectNameв #import "YourProjectName-Swift.h"будет именем проекта из шага 8. Полезно, если имя вашего проекта содержит специальные символы, и вы не уверены, как именно вы должны его отформатировать.
Чак Борис
40

Если вы используете Cocoapods и пытаетесь использовать модуль Swift в проекте ObjC, вы можете просто сделать следующее:

@import <FrameworkName>;

введите описание изображения здесь

KingPolygon
источник
1
Большое спасибо! ты спас мой день
Эша
Это работает как прелесть, если мы установили быстро сделанную библиотеку через Cocoapods. Проголосовал !!!
NSPratik
21

Перейдите к настройкам сборки в файле проекта и найдите «Имя заголовка интерфейса, созданного Objective-C» . Значением этого свойства является имя, которое вы должны включить.

Если ваше свойство «Product Module Name» (от которого зависит указанное выше свойство по умолчанию) зависит от того, компилируете ли вы для test / debug / release / etc (как это происходит в моем случае), то сделайте это свойство независимым от этого изменение путем установки собственного имени.

Лукас Калински
источник
15

Импорт Swiftфайла внутри Objective-cможет вызвать эту ошибку, если это не importправильно.

ПРИМЕЧАНИЕ. Вам не нужно импортировать файлы Swift извне, вам просто нужно импортировать один файл, который заботится о файлах Swift.

Когда вы создали / скопировали файл Swift внутри проекта Objective-C . Это автоматически создало бы соединительный заголовок.

Проверьте Objective-C Generated Interface Header Nameв Targets -> Build Settings.

введите описание изображения здесь

Исходя из вышеизложенного, я буду импортировать KJExpandable-Swift.hкак есть.

Ваш будет TargetName-Swift.h, где TargetNameотличается в зависимости от имени вашего проекта или другой цели, которую вы могли бы добавить и запустить на нем.

Как ниже моя цель KJExpandable, так этоKJExpandable-Swift.h
введите описание изображения здесь

Киран Джасвани
источник
12

Первый шаг:-

Выберите Project Target -> Build Setting -> Search («Определить») -> Define Module update value От Нет до Да.

«Определяет модуль»: ДА .

«Всегда встраивать стандартные библиотеки Swift»: ДА .

«Установить заголовок совместимости Objective-C»: ДА .

введите описание изображения здесь

Второй шаг:-

Добавьте класс файла Swift в файл Objective C ".h", как показано ниже

#import <UIKit/UIKit.h>

@class TestViewController(Swift File);

@interface TestViewController(Objective C File) : UIViewController

@end

Импортируйте имя_проекта (имя вашего проекта) -Swift.h в файле цели. ".M"

//TestViewController.m 
#import "TestViewController.h"

/*import ProjectName-Swift.h file to access Swift file here*/

#import "ProjectName-Swift.h"
Даршан Панчал
источник
Предварительное объявление (@class) класса - очень хороший момент! Спасибо!
Филипп Отто
10

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

#import <MyFramework/MyFramework-Swift.h>

MyFramework здесь настройка сборки «Product Module Name» (PRODUCT_NAME = MyFramework ).

Простое добавление #import "MyFramework-Swift.h"не сработает. Если вы проверите каталог скомпилированных продуктов (до того, как он #importбудет добавлен, чтобы у вас была хотя бы одна успешная сборка с некоторым кодом Swift в целевом объекте), вы все равно должны увидеть файл MyFramework-Swift.hв Headersкаталоге.

Миша Карпенко
источник
8

Если у вас есть проект, созданный в Swift 4, а затем добавленные файлы Objective-C, сделайте это следующим образом:

@objcMembers
public class MyModel: NSObject {
    var someFlag = false         
    func doSomething() {         
        print("doing something")
    }
}

Ссылка: https://useyourloaf.com/blog/objc-warnings-upgrading-to-swift-4/

Прашант Бхайани
источник
В моем коде после того, как я обновил его до Swift 4.2 от swift 3. Он не работает
SNarula
какую ошибку вы получаете? Я использовал приведенный выше код в Swift4.2 и он работает нормально.
Прашант Бхайани
Хорошо, это здорово.
Прашант Бхайани
4

Просмотрите предварительные заметки о Swift и Objective C в том же проекте

https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/BuildingCocoaApps/MixandMatch.html#//apple_ref/doc/uid/TP40014216-CH10-XID_75

Вы должны импортировать

#import "SCLAlertView-Swift.h"
Нитин Алабур
источник
3
Показал мне эту ошибку: файл «SCLAlertView-Swift.h» не найден.
Виктор Радченко
2
Должно быть именем проекта, а не именем файла - см. Мой ответ.
Билл
1
Спасибо за ссылку документации. Это было полезно для справки.
louielouie
2
Процитируем по предоставленной ссылке: The name of this header is your product module name followed by adding "-Swift.h".То есть, это не имя класса, как вы написали, а имя модуля вашего продукта, и он заботится об импорте всех быстрых файлов, а не только определенного
Крис
4

Найдите «Имя заголовка сгенерированного интерфейса Objective-C» в настройках сборки цели, которую вы пытаетесь построить (скажем, так MyApp-Swift.h), и импортируйте значение этого параметра (#import "MyApp-Swift.h" ) в исходный файл, к которому вы пытаетесь получить доступ. ваши Swift API.

Значение по умолчанию для этого поля $(SWIFT_MODULE_NAME)-Swift.h . Это можно увидеть, если дважды щелкнуть в поле значения параметра «Имя заголовка сгенерированного интерфейса Objective-C».

Кроме того, если у вас есть тире в имени вашего модуля (скажем так My-App), то $(SWIFT_MODULE_NAME)все черточки будут заменены подчеркиванием. Итак, вам придется добавить #import "My_App-Swift.h".

Миша Карпенко
источник
Лучше, чем утвержденный. Черты потрачены впустую 20 минут Я никогда не вернусь, ха-ха.
Рой Мулиа
3

Если вы хотите использовать файл Swift в Objective-C классе , то, начиная с Xcode 8, вы можете выполнить следующие шаги:

Если вы создали проект в Objective-C:

  1. Создать новый файл Swift
  2. Xcode автоматически запросит файл Bridge-Header
  3. Создайте это
  4. Импортируйте «ProjectName-Swift.h» в свой контроллер Objective-C (импортируйте в реализации, а не в интерфейсе) (если ваш проект имеет пробел между именами, используйте подчеркивание «Project_Name-Swift.h»)
  5. Вы сможете получить доступ к вашему классу Objective-C в Swift.

Скомпилируйте его, и если он сгенерирует ошибку компоновщика, например: скомпилирован с более новой версией языка Swift (3.0), чем предыдущие файлы (2.0) для архитектуры x86_64 или armv 7

Сделайте еще одно изменение в вашем

  1. Xcode -> Project -> Target -> Build Settings -> Use Legacy Swift Language Version -> Yes

Построй и беги.

Dheeraj D
источник
1
я не получаю этот вариант использования устаревшей языковой версии swift
rd_
1

Будьте осторожны с черточками и подчеркиванием, они могут быть перепутаны, и имя вашего проекта и имя цели не будут совпадать с SWIFT_MODULE_NAME.

Черточки и подчеркивания

Налойко Евгений
источник
1
#import <TargetName-Swift.h>

вы увидите, когда войдете с клавиатуры #import <и после автоматически Xcode сообщит вам об этом.

Эрхан Демирчи
источник
-1

Найдите файл .PCH внутри проекта. и затем добавьте #import "YourProjectName-Swift.h"Это будет импортировать заголовки классов. Так что вам не нужно импортировать в определенный файл.

#ifndef __IPHONE_3_0
#warning "This project uses features only available in iPhone SDK 3.0 and later."
#endif


#ifdef __OBJC__
    #import <Foundation/Foundation.h>
    #import <UIKit/UIKit.h>
    #import "YourProjectName-Swift.h"
#endif
Рам Г.
источник