Не могу использовать классы Swift внутри Objective-C

260

Я пытаюсь интегрировать Swiftкод в мое приложение. Мое приложение написано в, Objective-Cи я добавил Swiftкласс. Я сделал все, что описано здесь . Но моя проблема в том Xcode, что -Swift.hфайл не создан , только заголовки моста. Я создал его, но на самом деле он пуст. Я могу использовать все свои классы ObjC в Swift, но не могу сделать это наоборот. Я пометил свой быстрый класс, @objcно это не помогло. Что я могу сделать сейчас?

РЕДАКТИРОВАТЬ: Apple говорит: «Когда вы импортируете код Swift в Objective-C, вы полагаетесь на Xcode-generatedфайл заголовка, чтобы открыть эти файлы для Objective-C. [...] Имя этого заголовка - это имя модуля вашего продукта с последующим добавлением« -Swift.h ”."

Теперь, когда я хочу импортировать этот файл, он выдает ошибку:

    //MainMenu.m

    #import "myProjectModule-Swift.h" //Error: 'myProjectModule-Swift.h' file not found

    @implementation MainMenu

Вот мой файл FBManager.swift:

@objc class FBManager: NSObject {

    var descr = "FBManager class"

    init() {
        super.init()
    }

    func desc(){
        println(descr)
    }

    func getSharedGameState() -> GameState{
        return GameState.sharedGameState() //OK! GameState is written in Objective-C and no error here
    }
}
dnnagy
источник
27
YourProjectName-Swift.hЭто должен быть магический заголовочный файл, который Xcode автоматически создает для вас во время компиляции (вы не увидите его в браузере проекта). Попробуйте удалить созданный вами #import YourProjectName-Swift.hфайл и добавить в файлы, в которых вы хотите использовать классы Swift.
Грег
3
Ваше приложение, которое вы создаете, называется myProjectModule? -Swift.hФайл должен начинаться с названием приложения. У вас есть файл, оканчивающийся на -Bridging-Header.h? Вам следует. Если это так, первая часть этого файла - это имя вашего проекта. Объедините первую часть этого имени с -Swift.hи это то, что вы должны включить.
Vacawama
4
У меня это успешно работает в моем проекте, и все же -Swift.hна моем Mac нет никакого файла, заканчивающегося файлом , и все же я могу включить его. Так что не зацикливайтесь на поиске такого файла. Просто убедитесь, что вы называете это правильно.
Vacawama
2
@vacawama Обратите внимание, что вы можете увидеть содержимое после добавления оператора импорта в файл Objective-C путем нажатия на команду Command при нажатии на импорт, как если бы вы посещали любой другой файл заголовка.
Кендалл Хельмштеттер Гелнер
4
Я должен был использовать#import <MyProjectName/MyProjectName-Swift.h>
Оливер Пирмен

Ответы:

516

Я потратил около 4 часов, пытаясь включить его Swiftв своем Xcodeпроекте на базе Objective-C. Мой myproject-Swift.hфайл был успешно создан, но мой Xcodeне увидел мой Swift-classes. Итак, я решил создать новый Xcodeпроект на базе Objc и, наконец, я нашел правильный ответ! Надеюсь, этот пост кому-нибудь поможет :-)

Пошаговая интеграция Swift для проекта Xcode Objc:

  1. Создайте новый *.swiftфайл (в Xcode) или добавьте его с помощью Finder.
  2. Создайте, Objective-C bridging headerкогда Xcode спросит вас об этом.
  3. Реализуйте свой класс Swift:

    import Foundation
    
    // use @objc or @objcMembers annotation if necessary
    class Foo {
        //..
    }
  4. Откройте настройки сборки и проверьте следующие параметры:

    • Определяет модуль: YES

      Скопируйте и вставьте имя параметра в строку поиска

    • Название модуля продукта: myproject

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

    • Установите заголовок совместимости Objective-C: YES

      После добавления *.swiftфайла в проект это свойство появится в настройках сборки.

    • Сгенерированный Objective-C заголовок интерфейса: myproject-Swift.h

      Этот заголовок автоматически генерируется Xcode

    • Заголовок моста Objective-C: $(SRCROOT)/myproject-Bridging-Header.h
  5. Импортируйте заголовок интерфейса Swift в ваш файл * .m.

    #import "myproject-Swift.h"

    Не обращайте внимания на ошибки и предупреждения.

  6. Очистите и перестройте свой проект Xcode.
  7. Прибыль!
сиг
источник
2
Кто-нибудь видел упоминание о требуемой конфигурации (по крайней мере для меня) в документации по адресу: developer.apple.com/library/prerelease/ios/documentation/Swift/… в шаге 4 выше? Если это так, я пропустил это. Спасибо @ сиг.
Morkrom
2
Моя проблема была намного проще - я не смог найти файл, "myproject-Swift.h"поэтому мне кажется, что он не работает. Видимо, этот файл не виден в навигаторе проекта.
Асаф
6
@Asaf На самом деле, да, этот файл автоматически генерируется Xcode и находится в пути сборки вашего проекта. Таким образом, вы можете найти этот файл вручную в Finder / Console или открыть его непосредственно в Xcode, используя Cmd + LeftClick on #import "myproject-Swift.h".
Sig
1
Для меня # 5 было достаточно, чтобы решить проблему!
Skywinder
12
С вашими этими 4 часами вы сэкономили сотни наших часов, большое спасибо :) Сохранено в моем избранном;)
Abo3atef
65

Не создавайте заголовочный файл самостоятельно. Удалить тот, который вы создали.

Убедитесь, что ваши классы Swift помечены @objcили наследуются от класса, который является производным (прямо или косвенно) NSObject.

Xcode не будет генерировать файл, если у вас есть какие-либо ошибки компилятора в вашем проекте - убедитесь, что ваш проект собирается правильно.

Билл
источник
8
быть способным к сборке было для меня ключом. Не удалось собрать, потому что не смог найти мой файл -swift.h, но не смог найти мой файл -swift.h, потому что не смог собрать: /
anders
13
@anders, будучи пойманным в ловушку в этом цикле, вы можете использовать, find ~/library/Developer/Xcode/DerivedData/ -name "*-Swift.h"|xargs basename|sort -uчтобы увидеть, был ли файл создан с неожиданным именем, как это было для меня. :)
CodeReaper
38

Разрешите Xcode выполнять свою работу, не добавляйте / создавайте заголовок Swift вручную. Просто добавьте @objc перед вашим классом Swift.

@objc class YourSwiftClassName: UIViewController

В настройках вашего проекта найдите ниже флажки и измените его на ДА (как проект, так и цель)

Defines Module : YES
Always Embed Swift Standard Libraries : YES
Install Objective-C Compatibility Header : YES

Затем очистите проект и выполните сборку один раз, после того, как сборка завершится успешно (вероятно, следует), импортируйте указанный ниже файл заголовка в ваш файл .m класса target-c.

#import "YourProjectName-Swift.h" 

Boooom!

Бхарат Моди
источник
1
Спасибо, это было фантастически просто и решило мою проблему.
Фелипе
Я не вижу ни одной из этих опций в настройках сборки (Xcode 7.3.1). Что я должен делать?
iosdude
1
^ Пришлось переключиться с Basicна Allв верхней панели.
iosdude
1
Embedded Content Contains Swiftбыл изменен на Always Embed Swift Standard LibrariesXcode 8: stackoverflow.com/questions/38792650/…
Уильям Гранд
@WilliamGrand Спасибо за предложение, обновил ответ.
Бхарат Моди
28

Также, вероятно, полезно для тех из вас, у кого есть цель Framework :

Оператор импорта автоматически сгенерированного заголовочного файла немного отличается от целей приложения. В дополнение к другим вещам, упомянутым в других ответах, используйте

#import <ProductName/ProductModuleName-Swift.h>

вместо того

#import "ProductModuleName-Swift.h"

согласно документации Apple на Mix & Match для целевых структур.

Jeehut
источник
1
@dinesharjani Рад, что смог помочь! :)
Jeehut
Как насчет целевых комплектов?
Юлиан
14

Убедитесь, что ваш проект определяет модуль, и вы дали имя модулю. Затем перестройте, и Xcode создаст -Swift.hфайл заголовка, и вы сможете импортировать.

Вы можете установить определение модуля и имя модуля в настройках вашего проекта.

Лео Натан
источник
14

Подробности: проект Objective-C с кодом Swift 3 в Xcode 8.1

Задачи:

  1. Используйте быстрое перечисление в классе target-c
  2. Используйте enum target-c в классе swift

ПОЛНЫЙ ОБРАЗЕЦ

1. Класс Objective-C, использующий перечисление Swift

ObjcClass.h

#import <Foundation/Foundation.h>

typedef NS_ENUM(NSInteger, ObjcEnum) {
    ObjcEnumValue1,
    ObjcEnumValue2,
    ObjcEnumValue3
};

@interface ObjcClass : NSObject

+ (void) PrintEnumValues;

@end

ObjcClass.m

#import "ObjcClass.h"
#import "SwiftCode.h"

@implementation ObjcClass

+ (void) PrintEnumValues {
    [self PrintEnumValue:SwiftEnumValue1];
    [self PrintEnumValue:SwiftEnumValue2];
    [self PrintEnumValue:SwiftEnumValue3];
}

+ (void) PrintEnumValue:(SwiftEnum) value {
    switch (value) {
        case SwiftEnumValue1:
            NSLog(@"-- SwiftEnum: SwiftEnumValue1");
            break;
            
        case SwiftEnumValue2:
        case SwiftEnumValue3:
            NSLog(@"-- SwiftEnum: long value = %ld", (long)value);
            break;
    }
}

@end

Обнаружение кода Swift в коде Objective-C

В моем примере я использую SwiftCode.h для обнаружения кода Swift в Objective-C. Этот файл генерируется автоматически (я не создал физическую копию этого заголовочного файла в проекте), и вы можете только установить имя этого файла:

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

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

Если компилятор не может найти файл заголовка Swift-кода, попробуйте скомпилировать проект.

2. Класс Swift, использующий перечисление Objective-C

import Foundation

@objc
enum SwiftEnum: Int {
    case Value1, Value2, Value3
}

@objc
class SwiftClass: NSObject {
    
    class func PrintEnumValues() {
        PrintEnumValue(.Value1)
        PrintEnumValue(.Value2)
        PrintEnumValue(.Value3)
    }
    
    class func PrintEnumValue(value: ObjcEnum) {
        switch value {
        case .Value1, .Value2:
            NSLog("-- ObjcEnum: int value = \(value.rawValue)")
            
        case .Value3:
            NSLog("-- ObjcEnum: Value3")
            break
        }
        
    }
}

Обнаружение кода Objective C в коде Swift

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

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

Вы можете изменить имя файла заголовка моста:

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

Bridging-header.h

#import "ObjcClass.h"

использование

#import "SwiftCode.h"
...
[ObjcClass PrintEnumValues];
[SwiftClass PrintEnumValues];
[SwiftClass PrintEnumValue:ObjcEnumValue3];

результат

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


БОЛЬШЕ ОБРАЗЦОВ

Полные шаги интеграции Objective-c и Swift описаны выше . Теперь я напишу несколько других примеров кода.

3. Вызвать класс Swift из кода Objective-c

Свифт класс

import Foundation

@objc
class SwiftClass:NSObject {
    
    private var _stringValue: String
    var stringValue: String {
        get {
            print("SwiftClass get stringValue")
            return _stringValue
        }
        set {
            print("SwiftClass set stringValue = \(newValue)")
            _stringValue = newValue
        }
    }
    
    init (stringValue: String) {
        print("SwiftClass init(String)")
        _stringValue = stringValue
    }
    
    func printValue() {
        print("SwiftClass printValue()")
        print("stringValue = \(_stringValue)")
    }
    
}

Код Objective-C (вызывающий код)

SwiftClass *obj = [[SwiftClass alloc] initWithStringValue: @"Hello World!"];
[obj printValue];
NSString * str = obj.stringValue;
obj.stringValue = @"HeLLo wOrLd!!!";

результат

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

4. Вызвать класс Objective-c из кода Swift

Класс Objective-C (ObjcClass.h)

#import <Foundation/Foundation.h>

@interface ObjcClass : NSObject
@property NSString* stringValue;
- (instancetype) initWithStringValue:(NSString*)stringValue;
- (void) printValue;
@end

ObjcClass.m

#import "ObjcClass.h"

@interface ObjcClass()

@property NSString* strValue;

@end

@implementation ObjcClass

- (instancetype) initWithStringValue:(NSString*)stringValue {
    NSLog(@"ObjcClass initWithStringValue");
    _strValue = stringValue;
    return self;
}

- (void) printValue {
    NSLog(@"ObjcClass printValue");
    NSLog(@"stringValue = %@", _strValue);
}

- (NSString*) stringValue {
    NSLog(@"ObjcClass get stringValue");
    return _strValue;
}

- (void) setStringValue:(NSString*)newValue {
    NSLog(@"ObjcClass set stringValue = %@", newValue);
    _strValue = newValue;
}

@end

Свифт код (код вызова)

if let obj = ObjcClass(stringValue:  "Hello World!") {
    obj.printValue()
    let str = obj.stringValue;
    obj.stringValue = "HeLLo wOrLd!!!";
}

результат

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

5. Используйте расширение Swift в коде Objective-c

Быстрое расширение

extension UIView {
    static func swiftExtensionFunc() {
        NSLog("UIView swiftExtensionFunc")
    }
}

Код Objective-C (вызывающий код)

[UIView swiftExtensionFunc];

6. Используйте расширение Objective-c в быстром коде

Расширение Objective-C (UIViewExtension.h)

#import <UIKit/UIKit.h>

@interface UIView (ObjcAdditions)
+ (void)objcExtensionFunc;
@end

UIViewExtension.m

@implementation UIView (ObjcAdditions)
+ (void)objcExtensionFunc {
    NSLog(@"UIView objcExtensionFunc");
}
@end

Свифт код (код вызова)

UIView.objcExtensionFunc()
Василий Боднарчук
источник
Эти образцы действительно полезны, спасибо! А что касается Swift 4+, нам нужно добавить @objcMembersперед классом. Поскольку @objcвывод был уменьшен в Swift 4 для оптимизации. Например, свойство в классе, производном от NSObject, больше не будет выводить @objc по умолчанию (как это было в Swift 3). Я получил эту информацию из этого ответа .
Хастлион
11

У меня была та же проблема, и оказалось, что специальные символы в имени модуля заменены на xcode (в моем случае штрихи заканчивались подчеркиванием). В настройках проекта установите флажок «имя модуля», чтобы найти имя модуля для вашего проекта. После этого либо используйте, ModuleName-Swift.hлибо переименуйте модуль в настройках.

Макс Михеенко
источник
10
Я дебил. Я добавил имя класса, а затем добавил «-Swift». Оказывается, это название "модуля". +1 за то, что заставил меня понять это.
HotFudgeSunday
2
Еще один придурок, который думал, что это было имя класса!
Чарли Мартин
9

Файл создается автоматически (о Xcode 6.3.2 здесь). Но вы этого не увидите, так как он находится в папке «Производные данные». После того, как вы пометите свой swift класс @objc, скомпилируйте, затем найдите Swift.hв папке «Производные данные». Вы должны найти там заголовок Swift.

У меня была проблема, что XCode переименовал мой my-Project-Swift.hв my_Project-Swift.hXCode не любит "." "-"и т. Д. Символы. С помощью метода выше вы можете найти имя файла и импортировать его в класс Objective-C.

brainray
источник
1
Это тоже решило мою проблему. В моем файле .m я импортирую файл, как это, #import "my_project-Swift.h" и мое настоящее имя проектаmy-project
Bhavin_m
Внимание - не просто "." "-" также пробелы :(
user1105951
8

Просто включите #import "myProject-Swift.h" в файл .m или .h

PS Вы не найдете "myProject-Swift.h" в файловом инспекторе, он скрыт. Но он генерируется приложением автоматически.

Свитлана
источник
Спасибо за внимание, приятель.
Фелипе
Этот ответ помог мне и спас мой день. Важно то, что Xcode генерирует его автоматически, и это скрытый файл. Я сам создавал «myProject-Swift.h», и он не работал.
C0mrade
5

Ответ @sig - один из лучших, однако он не работал для меня со старым проектом (не новым!), мне нужно было внести некоторые изменения. После многих изменений я нашел рецепт для себя (используя XCode 7.2):

  1. Имя модуля продукта: $ (PRODUCT_NAME: c99extidentifier)
  2. Определяет модуль: НЕТ
  3. Встроенный контент содержит Swift: НЕТ
  4. Установить заголовок совместимости Objective-C: ДА
  5. Заголовок моста Objective C: ProjectName-Bridging-Header.h

Последний пункт (5) был решающим. Я помещаю его только во второй раздел (поле «Цели»), поле «Проект» следует оставить пустым:введите описание изображения здесь противном случае он не сгенерировал правильный файл "Project-Swift.h" для меня (он не включал быстрые методы).

Дарий Миляускас
источник
1
также полезная ссылка: ericasadun.com/2014/08/21/…
Дариус Миляускас
1
Спасибо Спасибо Спасибо Большое @DariusMiliauskas работает только с вашей ссылкой
a4arpan
1
@DariusMiliauskas спасибо большое! 5 пунктов также решили проблему для меня в старом проекте Xcode
tatiana_c
Define Modulesдолжно быть No??
Сунил Чаухан
@SunilChauhan, да, он используется только для фреймворков .
Юлиан Онофрей
5

Есть два условия,

  • Используйте свой файл swift в файле target c.
  • Используйте ваш файл цели в файле Swift.

Итак, для этой цели вы должны выполнить следующие шаги:

  • Добавьте ваш swift-файл в проект target-c или наоборот.
  • Создать файл заголовка (.h).
  • Зайдите в настройки сборки и выполните следующие шаги с поиском,

    1. найдите этот текст "brid" и установите путь к вашему файлу заголовка.
    2. «Определяет модуль»: ДА.
    3. «Всегда встраивать стандартные библиотеки Swift»: ДА.
    4. «Установить заголовок совместимости Objective-C»: ДА.

После этого очистите и восстановите ваш проект.

Используйте свой файл swift в файле target c.

В этом случае сначала напишите «@objc» перед вашим классом в файле swift.

После этого в вашей целевой файл c, напишите это,

  #import "YourProjectName-Swift.h"

Используйте ваш файл цели в файле Swift.

В этом случае, в своем заголовочном файле напишите это,

  #import "YourObjective-c_FileName.h"

Я надеюсь, что это поможет вам.

викас праджапати
источник
4

Для Swift 5:

  1. Добавьте @objcключевое слово в ваш класс и методы
  2. Добавьте publicключевое слово в ваш класс и методы
  3. Пусть ваш класс унаследует от NSObject
  4. Построить проект
  5. Поместите #import "MyProject-Swift.h"в свой файл Objective-C

    @objc
    public class MyClass: NSObject {
    
        @objc
        public func myMethod() {
    
        }
    }
Нико С.
источник
«Добавьте ключевое слово @objc к своему классу и методам» - то же самое для Swift 4
Кшиштоф
3

В моем случае, кроме этих шагов:

  1. Название модуля продукта: myproject
  2. Определяет модуль: ДА
  3. Встроенный контент содержит Swift: ДА
  4. Установить заголовок совместимости Objective-C: ДА
  5. Заголовок моста Objective-C: $ (SRCROOT) /Sources/SwiftBridging.h

Мне нужно было сделать класс общедоступным , чтобы создать файл productName-Swift.h :

import UIKit

   @objc public class TestSwift: NSObject {
       func sayHello() {
          print("Hi there!")
       }
   }
93sauu
источник
2

Я только что обнаружил, что добавление каталога быстрых файлов в проект не будет работать. Сначала нужно создать группу для каталога, затем добавить файлы swift ...

Даррен Элерс
источник
@ <определенный класс>; должны быть определены, и тогда использующий проект увидит эти файлы.
Никита
2

У меня была та же проблема, и в конце концов оказалось, что они не были привязаны к одним и тем же целям. Класс ObjC присоединен к Target1 и Target2, класс Swift присоединен только к Target1 и не виден внутри класса ObjC.

Надеюсь, это кому-нибудь поможет.

Dani.Rangelov
источник
Я полностью упустил из виду это с разными целями для постановки и производства. Спасибо за ваш ответ!
Бенджамин Мартин
Что значит «прикрепленный»?
Юлиан
"attach" = "members", они должны быть указаны в качестве целевых элементов
Dani.Rangelov
1

моя проблема заключалась в том, что я застрял после того, как xcode создал файл моста, но все же я получил ошибку в имени файла заголовка MYPROJECTNAME-swift.h

1. Я проверяю в терминале и ищу все автоматически созданные файлы быстрого моста:

find ~/library/Developer/Xcode/DerivedData/ -name "*-Swift.h"|xargs basename|sort -

Вы видите, что создал XCode.

  1. в моем случае у меня было место в имени моего проекта, и xcode заменил это '_'
user1105951
источник
1

Когда вы добавляете новые файлы Swift в проект, пожалуйста, убедитесь, что вы добавляете их в правильные цели. Пожалуйста, убедитесь, что каждый файл swift, который вы собираетесь использовать, наследует класс NSObject и имеет пометку @ObjCMembers. Измените на YES в настройках сборки в опции ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES. Измените на YES в настройках сборки под опцией DEFINES_MODULE.

Борис
источник
0

У меня та же ошибка: myProjectModule-Swift.hфайл не найден ", но в моем случае реальная причина была в неправильной цели развертывания:" Swiftнедоступна в OS X ранее 10.9; пожалуйста, установите MACOSX_DEPLOYMENT_TARGETзначение 10,9 или выше (в настоящее время это «10,7»), поэтому, когда я изменил цель развертывания на 10,9 - проект успешно скомпилирован.

Славик
источник
0

Моя проблема заключалась в том, что автоматическое создание файла -swift.h не смогло понять подкласс CustomDebugStringConvertible. Вместо этого я изменил класс на подкласс NSObject. После этого файл -swift.h теперь правильно включает класс.

Джастин Домниц
источник
0

У меня были проблемы, связанные с тем, что я добавлял классы в свой мостовой заголовок target-c, а в импортированных заголовках target-c они пытались импортировать быстрый заголовок. Это не понравилось.

Поэтому во всех моих классах target-c, которые используют swift, но также имеют мостовые соединения, ключом было убедиться, что вы используете предварительные объявления классов в заголовках, а затем импортируйте файл "* -Swift.h" в файл .m.

horseshoe7
источник
0

Мне не нужно было менять какие-либо настройки в сборке или добавлять @obj в класс.

Все, что мне нужно было сделать, это создать bridge-header, который автоматически создавался при создании классов Swift в проекте Objective-c. И тогда я просто должен был сделать

import "Bedtime-Swift.h" <- внутри файла target-c, необходимого для использования этого файла swift.

coolcool1994
источник
0

ну, после прочтения всех комментариев, попыток, чтения и повторных попыток мне удалось включить быстрые классы в мой проект Big obj-c. Итак, спасибо за помощь. Я хотел поделиться одним советом, который помог мне лучше понять процесс. В классе .m, перешел к строке импорта целевого имени swift #import "myTargetName-Swift.h" и щелкнул ключ:

команда + щелчок мыши -> Перейти к определению введите описание изображения здесь

Там вы можете увидеть весь перевод от swift к obj-c, и вы найдете различные функции, повторно объявленные в obj-c. Надеюсь, этот совет поможет вам так же, как и мне.

Техно Маг
источник
0

Использование Swift-классов в Objective-C

Если вы собираетесь импортировать код внутри цели приложения (смешивая Objective-C и Swift в одном проекте), вам следует использовать следующую строку импорта, #import "<#YourProjectName#>-Swift.h"чтобы представить код Swift в коде Objective-C [Смешивание кода Swift и Objective-C в проекте]

В этом посте я опишу, как импортировать статическую библиотеку Swift в код Objective-C

Потребитель Objective-C -> Swift статическая библиотека

Версия Xcode 10.2.1

Создать статическую библиотеку Swift

Следуйте Create Swift static libraryсо следующими дополнениями:

Выставить Swift API. Использовать функции Swift из Objective-C [О программе]

После сборки вы должны найти <product_name>-Swift.hфайл, который должен быть расположен в DerivedSources [Файл не найден]

Потребитель Objective-C со статической библиотекой Swift

Drag and dropбинарный файл в проект Xcode [About]

Link Library[Неопределенные символы] [ссылка против встраивания]

Project editor -> select a target -> General -> Linked Frameworks and Libraries -> add -> Add Others... -> point to `lib<product_name>.a` file
//or
Project editor -> select a target -> Build Phases -> Link Binary With Libraries -> add -> Add Others... -> point to `lib<product_name>.a` file

Добавить Library Search paths[Библиотека не найдена для] [Рекурсивный путь]

Project editor -> select a target -> Build Settings -> Search Paths -> Library Search paths -> add path to the parent of `lib<product_name>.a` file

Добавить Header Search Paths[Модуль не найден] [Рекурсивный путь]

Project editor -> select a target -> Build Settings -> Search Paths -> Header Search Paths -> add path to generated `<product_name>-Swift.h` file 

Добавить пустой .swift fileв проект Objective-C. [Неопределенные символы] Когда Xcode спросит, нажмите Create Bridging Header(он создаст module_name-Bridging-Header.h) и настройте путь к этому файлу в

Project editor -> select a target -> Build Settings -> Swift Compiler - General -> Objective-C Bridging Header

Импортировать модуль в код клиента Objective C [файл не найден] [имя_модуля]

#import "module_name-Swift.h"

Больше примеров здесь

yoAlex5
источник
0

XCode 11.3.1:

Когда я хочу использовать внутренний класс Swift в коде objc, он не компилируется для ошибки «неопределенный символ» (для внутреннего и внешнего класса), я проверял сгенерированный заголовок «-swift.h», и оба класса там.

После нескольких часов попыток я преобразовываю внутренний класс в обычный класс, и он компилируется.

Я очищаю проект, удаляю папку DerivedData и она компилируется.

Билл Чан
источник
1
Вы пытались добавить @objcдо объявления внутреннего класса?
Деньги
спасибо @dnnagy, проверил, что это не проблема синтаксиса.
Билл Чан
-1

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

Я исправил это, выбрав [MyTarget]> «Фазы сборки»> «Копировать ресурсы комплекта», затем нажал кнопку «плюс» и добавил файлы Swift.

onemoreanimal
источник
Ресурсы Copy Bundle не должны содержать исходный код
Билл Чен,