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

166

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

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

#import "SCLAlertView.swift" - 'SCLAlertView.swift' file not found
  • 9
    люблю этот проект!
Теги:
import

11 ответов

285
Лучший ответ

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

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

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

  • 4
    Обратите внимание, что если вы попытаетесь использовать имя файла Swift при импорте, вы получите сообщение об ошибке «Ожидается»; после декларатора верхнего уровня ". в вашем файле Swift после «импорта основы».
  • 1
    Вау, отличный улов! Небольшой вопрос: могу ли я где-нибудь увидеть, как называется этот проект? Я попробовал то, что вы предложили, и все еще получаю ошибки, так что я боюсь, что название проекта может быть неправильным.
Показать ещё 24 комментария
99

Инструкции с веб-сайта Apple:

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

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

#import "ProductName-Swift.h"

Revision:

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

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

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

Изображение 1798

  • 0
    Работал отлично
  • 2
    Помог только импорт "ProductName-Swift.h" в файлы .m. Добавление того же в файл .pch выдает: «Не удается найти объявление протокола для« CLLocationManagerDelegate »; вы имели в виду« NSLayoutManagerDelegate »?»
Показать ещё 9 комментариев
86

Здесь что делать:

  • Создайте новый проект в ObjC

  • Создайте новый .swift файл

    • Появится всплывающее окно и спросит: "Хотелось бы настроить заголовок" w480 "?".
    • Выберите Да.
  • Нажмите файл проекта Xcode

  • Нажмите Настройки сборки

  • Найдите панель поиска и найдите Определить модуль.

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

  • Поиск Имя модуля продукта.

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

  • В делетете приложения добавьте следующее: #import "YourProjectName-swift.h"


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

#import "YourProjectName-swift.h"

  • 1
    Изменение значения Defines module в Build settings на « Yes - это то, что исправило для меня!
  • 0
    Встроенный контент содержит Swift: ДА ИСПОЛЬЗУЙТЕ это также
Показать ещё 5 комментариев
23

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

@import <FrameworkName>;

Изображение 1799

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

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

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

7

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

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

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

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

Изображение 1800

Основываясь на выше, я импортирую KJExpandable-Swift.h как есть.

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

Как ниже моя цель KJExpandable, так что KJExpandable-Swift.h
Изображение 1801

  • 0
    это работает для меня, спасибо
6

Первый шаг: -

Выберите цель проекта → Настройка сборки → Поиск ( "Определить" ) → Определить модуль Обновить значение Нет до Да

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

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

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

Изображение 1802

Второй шаг: -

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

#import <UIKit/UIKit.h>

@class TestViewController(Swift File);

@interface TestViewController(Objective C File) : UIViewController

@end

Импортировать 'имя_проекта (ваше имя проекта) -Swift.h' в Objective C ".m" файл

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

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

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

Оформить предварительные выпуски о 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
    Должно быть именем проекта, а не именем файла - см. Мой ответ.
Показать ещё 2 комментария
2

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

Значение по умолчанию для этого поля $(SWIFT_MODULE_NAME)-Swift.h. Вы можете увидеть это, если вы дважды щелкните в поле значений параметра "Objective-C Generated Interface Header Name".

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

  • 0
    Лучше, чем утвержденный. Черты потрачены впустую 20 минут, я никогда не вернусь, ха-ха.
0

Если вы импортируете 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.

0

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

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

  • Создать новый файл Swift
  • Xcode автоматически предложит файл Bridge-Header
  • Сгенерировать его
  • Импортировать "ProjectName-Swift.h" в ваш контроллер Objective-C (импорт в реализации не в интерфейсе) (если в вашем проекте есть место между именами, используйте знак подчеркивания "Project_Name-Swift.h" )
  • Вы сможете получить доступ к вашему классу Objective-C в Swift.

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

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

  1. Xcode → Project → Target → Настройки сборки → Использовать устаревшую версию языка Swift → Да

Сборка и запуск.

  • 0
    я не получаю этот вариант использования устаревшей языковой версии swift

Ещё вопросы

Сообщество Overcoder
Наверх
Меню