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

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

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

#import "SCLAlertView.swift" - 'SCLAlertView.swift' file not found

16 ответов

Решение

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

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

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

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

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

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

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

  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"

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

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

В разделе "Параметры сборки" в разделе "Упаковка" убедитесь, что для параметра " Определить модуль" для этой целевой платформы задано значение " Да". Импортируйте код 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.

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

@import <FrameworkName>;

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

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

Импорт 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

Первый шаг:-

Выберите 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"

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

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

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

Есть одно предостережение, если вы импортируете код 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 каталог.

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

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

https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/BuildingCocoaApps/MixandMatch.html

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

#import "SCLAlertView-Swift.h"

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

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

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

Если вы хотите использовать файл 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

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

#import <TargetName-Swift.h>

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

только несколько советов по синтаксису, про Xcode уже все сказано

  1. вы не можете импортировать «чистые» функции, только классы, даже если они помечены как «общедоступные», поэтому:

    общественная функция f1(){ print("f1"); }

НИ В КОЕМ СЛУЧАЕ вызываться не будет.

  1. Если вы пишете классы, добавьте наследование от NSObject, другие НЕЛЬЗЯ использовать.

  2. если он наследуется от NSObject, как показано ниже:

    Утилиты класса: NSObject{

    статическая функция aaa()->String{return "AAA"}

    @objc статическая функция bbb()->String{возврат "BBB"}

    @objc private static func ccc()->String {возврат "CCC"}

    }

в ОБЖК:

aaa() НЕ вызывается: "Нет известного метода класса для селектора 'aaa'"

ббб() хорошо

ccc() НЕ вызывается: "Нет известного метода класса для селектора 'aaa'"

Найдите файл.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
Другие вопросы по тегам