Импортирование быстрой структуры в проект 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
Будет создано два файла:
Info.plist
- Build Settings -> Info.plist File
<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
Я автоматически добавлю фреймворк в:
Project editor -> select a target -> General -> Linked Frameworks and Libraries
Project editor -> select a target -> Build Phases -> Embed Frameworks
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;
Больше примеров здесь