Неможливо використовувати класи Swift всередині Objective-C


260

Я намагаюся інтегрувати Swiftкод у свою програму. У моїй програмі написано, Objective-Cі я додав Swiftклас. Я зробив тут усе описане . Але моя проблема полягає в тому, що Xcodeя не створив -Swift.hфайл, а лише мостові заголовки. Тому я створив його, але він фактично порожній. Я можу використовувати всі мої класи ObjC в Swift, але я не можу це зробити навпаки. Я відзначив свій стрімкий клас, @objcале це не допомогло. Що я можу зробити зараз?

EDIT: 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
    }
}

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-клавішу при імпорті, як ніби ви відвідували будь-який інший файл заголовка.
Kendall Helmstetter Gelner

4
Мені довелося скористатися#import <MyProjectName/MyProjectName-Swift.h>
Олівер Пірмен

Відповіді:


516

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

Покрокова інтеграція для проекту на базі 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файлу до проекту ця властивість з’явиться в Налаштуваннях збірки

    • Об'єктивний-заголовний інтерфейсний заголовок: myproject-Swift.h

      Цей заголовок автоматично генерується Xcode

    • Об’єктивний заголовок мосту-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 вище? Якщо це так, я пропустив це. Дякую @sig.
Моркром

2
Моя проблема була набагато простішою - я не міг знайти файл, "myproject-Swift.h"тому мені здається, що він не працює. Мабуть, цей файл не видно у навігаторі проекту.
Асаф

6
@Asaf Насправді, так, цей файл автоматично генерується за допомогою Xcode та розміщення у вашому шляху складання проекту. Отже, ви можете знайти цей файл вручну в Finder / Console або відкрити його безпосередньо в Xcode, використовуючи Cmd + LeftClick #import "myproject-Swift.h".
sig

1
Щодо мене №5 було достатньо для вирішення проблеми !!
skywinder

12
За свої ці 4 години ви зберегли сто наших годин, велике спасибі :)
Зберегли

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). Що я повинен зробити?
іосдуда

1
^ Довелося перейти від Basicдо Allу верхній панелі.
іосдуда

1
Embedded Content Contains Swiftбуло змінено на Always Embed Swift Standard LibrariesXcode 8: stackoverflow.com/questions/38792650/…
William Grand

@WilliamGrand Дякую за пропозицію, оновив відповідь.
Бхарат Моді

28

Можливо, також корисно для тих, хто має рамкову ціль :

Оператор імпорту заголовки автоматично генерується виглядає трохи відрізняється від програми цілей. На додаток до інших речей, згаданих в інших відповідях, використовуйте

#import <ProductName/ProductModuleName-Swift.h>

замість

#import "ProductModuleName-Swift.h"

відповідно до документації щодо Apple Mix & Match для рамкових цілей.


1
@dinesharjani Рада, що можу допомогти! :)
Jeehut

Що з цілями пакетів?
Юліан Онофрей

14

Переконайтесь, що ваш проект визначає модуль, і ви вказали його ім'я. Потім відновіть, і Xcode створить-Swift.h файл заголовка, і ви зможете імпортувати.

Ви можете встановити визначення модуля та ім'я модуля в налаштуваннях проекту.


14

Деталі: Проект Objective-C з кодом Swift 3 в Xcode 8.1

Завдання:

  1. Використовуйте швидкий перелік у класі-c клас
  2. Використовуйте en-c enum у швидкому класі

ПОВНИЙ ЗРАЗ

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

Виявити код Свіфта в коді 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 у проекті швидкого 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

Код Swift (код виклику)

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

Код Swift (код виклику)

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). Але ви його не побачите, оскільки він знаходиться у папці Отримані дані. Після позначення вашого швидкого класу @objcскомпілюйте та знайдітьSwift.h у своїй папці Отримані дані. Ви повинні знайти там заголовок Swift.

У мене виникла проблема, що Xcode перейменував мій my-Project-Swift.hна my_Project-Swift.hXcode, не любить "." "-"тощо. За допомогою вищевказаного методу ви можете знайти ім'я файлу та імпортувати його до класу Objective-C.


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. Об'єктивний мост-заголовок мосту: ProjectName-Bridging-Header.h

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


1
також корисне посилання: ericasadun.com/2014/08/21/…
Дарій Міліаускас

1
Дякую Спасибі Спасибі Велике спасибі @DariusMiliauskas тільки отримав це, працюючи з вашим посиланням
a4arpan

1
@DariusMiliauskastщо дякує! 5 балів також вирішив питання для мене в старому проекті Xcode
tatiana_c

Define Modulesповинно бути No??
Sunil Chauhan


5

Є дві умови,

  • Використовуйте свій швидкий файл у файлі цілі c.
  • Використовуйте свій цільовий файл c у швидкому файлі.

Отже, для цього вам потрібно виконати наступні кроки:

  • Додайте свій швидкий файл у проект target-c або навпаки.
  • Створіть заголовок (.h) файл.
  • Перейдіть до " Налаштування збирання" та виконайте нижче кроки з пошуком,

    1. шукайте цей текст "brid" і встановіть шлях до файлу заголовка.
    2. "Визначає модуль": ТАК.
    3. "Завжди вставляйте швидкі стандартні бібліотеки": ТАК.
    4. "Встановити заголовок сумісності Objective-C": ТАК.

Після цього очистіть і відновіть свій проект.

Використовуйте свій швидкий файл у файлі цілі c.

У такому випадку спочатку напишіть "@objc" перед класом у швидкий файл.

Після цього у свій об'єктивний файл c напишіть це,

  #import "YourProjectName-Swift.h"

Використовуйте свій цільовий файл c у швидкому файлі.

У такому випадку у своєму файлі заголовка напишіть це,

  #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
Krzysztof

3

У моєму випадку, крім цих кроків:

  1. Назва модуля продукту: мійпроект
  2. Визначає модуль: ТАК
  3. Вбудований вміст містить Swift: ТАК
  4. Встановіть заголовок сумісності Objective-C: ТАК
  5. Об'єктивний мост-заголовок: $ (SRCROOT) /Sources/SwiftBridging.h

Мені потрібно було поставити клас як публічний , щоб створити файл productName-Swift.h :

import UIKit

   @objc public class TestSwift: NSObject {
       func sayHello() {
          print("Hi there!")
       }
   }

2

Щойно я виявив, що додавання каталогу швидких файлів до проекту не буде працювати. Спочатку потрібно створити групу для каталогу, а потім додати швидкі файли ...


@ <конкретний клас>; слід визначитись, і тоді проект, що використовує, побачить ці файли.
Микита

2

У мене була така ж проблема, і нарешті виявилося, що вони не були прив’язані до одних і тих же цілей. Клас ObjC приєднаний до Target1 і Target2, клас Swift приєднаний лише до Target1 і не видно всередині класу ObjC.

Сподіваюся, що це комусь допоможе.


Я цілком не помітив цього з різними цілями для постановки та виробництва. Спасибі за вашу відповідь!
Бенджамін Мартін

Що означає "прикріплений"?
Юліан Онофрей

"attach" = "members", їх слід вказати як цільових членів
Dani.Rangelov

1

моя проблема полягала в тому, що я застряг після того, як xcode створив міст-файл, але все-таки я отримав помилку в назві файлу заголовка MYPROJECTNAME-swift.h

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

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

ви бачите, що створив xcode.

  1. у моєму випадку у мого проекту було місце та замінити xcode це "_"

1

Коли ви додаєте нові файли Swift до проекту, переконайтеся, що ви додали їх до правильних цілей. Будь ласка, переконайтеся, що кожен швидкий файл, який ви будете використовувати, успадковує клас NSObject і пояснюється з допомогою @ObjCMembers Change на ТАК у налаштуваннях збірки під опцією ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES. Змініть на YES у налаштуваннях збірки в опції DEFINES_MODULE.


0

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


0

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


0

У мене виникли проблеми з тим, що я б додав класи до мостового заголовка target-c, а в тих заголовках Obje-c, які були імпортовані, вони намагалися імпортувати швидкий заголовок. Це не сподобалось.

Отже, у всіх моїх об'єктивних класах, які використовують стрімкий, але також мостовий, головним було переконатися, що ви використовуєте декларації класу в заголовках, а потім імпортуєте файл "* -Swift.h" у файл .m.


0

Мені не потрібно було змінювати будь-які настройки в збірці або додавати @obj до класу.

Все, що мені потрібно було зробити, - це створити міст-заголовок, який автоматично створювався, коли я створював класи Swift в проект Objective-c. І тоді я просто повинен був зробити

імпортувати "Bedtime-Swift.h" <- всередині файла target-c, який потрібен для використання цього швидкого файлу.


0

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

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

Там ви можете побачити весь переклад від швидкого до obj-c і там ви знайдете різні функції, повторно оголошені в obj-c. Сподіваюся, ця порада допоможе вам стільки, скільки допомогла мені.


0

Використання класів Swift в Objective-C

Якщо ви збираєтеся імпортувати код у межах програми App Target (Змішування Objective-C і Swift в одному проекті), ви повинні використовувати наступний рядок імпорту, #import "<#YourProjectName#>-Swift.h"щоб викрити код Swift коду Objective-C [Змішування коду Swift та Objective-C у проекті]

У цій публікації я опишу, як імпортувати статичну бібліотеку Swift до коду Objective-C

Object-C споживач -> Швидка статична бібліотека

Версія Xcode 10.2.1

Створіть статичну бібліотеку Swift

Дотримуйтесь Create Swift static library наступних доповнень:

Розкрийте Swift API. Використання функцій Swift з Objective-C [Про програму]

Після побудови ви повинні знайти <product_name>-Swift.hфайл, який повинен бути розташований у DerivedSources [Файл не знайдено]

Споживчий об'єктив-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 натисніть Створити 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"

Більше прикладів тут


0

XCode 11.3.1:

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

Пробуючи години, я перетворюю внутрішній клас у звичайний клас, і він компілюється.

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


1
Ви намагалися додати @objcдо декларації внутрішнього класу?
dnnagy

дякую @dnnagy, перевірив, що це не проблема синтаксису.
Білл Чан

-1

Зробивши все вище, я все-таки помилився. Моя проблема виявилася тим, що потрібні мені файли Swift чомусь не додавались до ресурсів пакету.

Я вирішив це, перейшовши в [MyTarget]> Фази збірки> Копіювати ресурси ресурсу, потім натиснув кнопку плюс і додав файли Swift.


Копіювати ресурси "Пакет" не повинно містити вихідний код
Білл Чан
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.