Импортирование быстрой структуры в проект objective-c

Я импортирую swift framework в проект objective-c следующим образом:

@import MyFramework;

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

Класс, который распознается:

public class RecognizedClass:UIViewController, WKNavigationDelegate, WKScriptMessageHandle 
 { ... } 

Класс, который не является:

public class VeediUtils
{ ... } 

Они оба общедоступны, так почему первый признан в рабочей области, а другой нет?

Также я вижу в файле заголовка MyFramework-Swift.h, что класс

@interface RecognizedClass : UIViewController <WKNavigationDelegate, WKScriptMessageHandler>

Появится, пока другой не

Почему это?

Также указать, что эта же процедура работает, когда я импортирую swift framework в быстрый проект

Ответ 1

Чтобы получить доступ к быстрому классу в objc, который не унаследован от NSObject, вам необходимо:

@objc public class VeediUtils

Класс или протокол Swift должен быть помечен атрибутом @objc для доступа и использования в Objective-C. Этот атрибут сообщает компилятору, что к этой части кода Swift можно получить доступ из Objective-C. Если ваш класс Swift является потомком класса Objective-C, компилятор автоматически добавляет вам атрибут @objc.

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

Ответ 2

Если вы ранее настроили Project для интеграции с Swift и хотите использовать Swift Dynamic Framework, вы должны импортировать его следующим образом (замените {value} соответствующими именами в зависимости от вашего Project):

#import <{MyFramework}/{MyFrameworkMainClass}-Swift.h>  
#import "{YourProjectTargetName}-Swift.h"

EDIT:

Если для вашей платформы Defines Module установлено значение true, вы можете импортировать ее следующим образом:

@import MyFramework;

Ответ 3

Вы должны добавить @objc в объявление класса VeediUtils или сделать его наследованием от NSObject. В противном случае он не будет виден Objective-C.

В вашем случае RecognizedClass распознается, потому что это подкласс UIViewController, который является подклассом NSObject.

Ответ 4

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

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

В этом посте я опишу, как импортировать фреймворк Swift в код Objective-C

Потребитель Objective-C → Swift динамическая структура

Версия Xcode 10.2.1

Создать фреймворк Swift

Создать каркасный проект или создать целевой каркас

File -> New -> Project... -> Cocoa Touch Framework
//or
Project editor -> Add a Target -> Cocoa Touch Framework

Будет создано два файла:

  1. Info.plist - Build Settings -> Info.plist File
  2. <product_name>.h - Build Phases -> Headers. Это заголовочный файл зонтика [About]

Добавить файлы .swift

Select '.swift' file -> Select File Inspectors Tab -> Target Membership -> Select the target
//or
Project editor -> select a target -> Build Phases -> Compile Sources -> add files

Разоблачить Swift API. Чтобы использовать функции Swift из Objective-C[About]

Библиотека сборки - ⌘ Command + B или Product -> Build

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

Найти сгенерированный вывод[Build location]

Products group -> <product_name>.framework -> Show in Finder

Структура включает в себя

  • Info.plist
  • Папка Modules с:
    • module.modulemap[About] [Custom modulemap] Этот файл был создан автоматически, поскольку Build Settings -> Defines Module -> YES
    • Папка <product_name>.swiftmodule с
      • .swiftdoc - документы
      • .swiftmodule - общедоступный интерфейс/определения
  • Папка Headers с:
    • файлы из раздела Headers. Есть открытые интерфейсы/определения
    • <product_name>-Swift.h - сгенерированный Xcode файл заголовка[About]

Использование фреймворка Swift

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

Embed binaries[Library not loaded] [Link vs Embed]

Project editor -> select a target -> General -> Embedded Binaries -> path to '<product_name>.framework' file

Я автоматически добавлю фреймворк в:

  1. Project editor -> select a target -> General -> Linked Frameworks and Libraries
  2. Project editor -> select a target -> Build Phases -> Embed Frameworks
  3. Project editor -> select a target -> Build Phases -> Link Binary With Libraries

Добавить Framework Search paths[Module not found] [Recursive path]

Project editor -> select a target -> Build Settings -> Search Paths -> Framework Search paths -> add path to the parent of '<product_name>.framework' file

Импорт модуля в код клиента Objective-C[module_name]

@import module_name;

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