Я написал библиотеку на Swift и не смог импортировать ее в свой текущий проект, написанный на Objective-C.
Есть ли способы его импортировать?
#import "SCLAlertView.swift" - 'SCLAlertView.swift' file not found
Я написал библиотеку на Swift и не смог импортировать ее в свой текущий проект, написанный на Objective-C.
Есть ли способы его импортировать?
#import "SCLAlertView.swift" - 'SCLAlertView.swift' file not found
Ответы:
Вам нужно импортировать TargetName-Swift.h
. Обратите внимание, что это целевое имя - другие ответы делают ошибку при использовании имени класса.
Этот единственный файл является автоматически сгенерированным заголовком, который определяет интерфейсы Objective C для всех классов Swift в вашем проекте, которые либо аннотированы, @objc
либо наследуются от них NSObject
.
Соображения:
Если ваше целевое имя содержит пробелы, замените их подчеркиванием (например, My Project
становится My_Project-Swift.h
)
Если ваша цель - фреймворк, вам нужно импортировать <TargetName/TargetName-Swift.h>
Убедитесь, что ваш файл Swift является членом цели
Инструкции с сайта Apple:
Чтобы импортировать код Swift в Objective-C из того же фреймворка
В разделе параметров сборки , в упаковке , убедитесь , что Определяет модуль настройка для этой цели рамочной установлена в Yes . Импортируйте код 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.
NSObject
!!! Вы не можете просто объявить class Blah
в быстром и заставить его работать. это должно бытьclass Blah : NSObject
Вот что нужно сделать:
Создать новый проект в Objective-C
Создать новый .swift
файл
Нажмите на свой файл проекта XCode
Нажмите на настройки сборки
Найдите панель поиска и найдите модуль Defines .
Измените значение на Да .
Поиск по названию модуля продукта .
Измените значение на имя вашего проекта.
В App делегат добавьте следующее: #import "YourProjectName-Swift.h"
Примечание: всякий раз, когда вы хотите использовать свой файл Swift, вы должны импортировать следующую строку:
#import "YourProjectName-Swift.h"
Defines module
в Build settings
к Yes
то , что фиксированные вещи для меня!
YourProjectName
в #import "YourProjectName-Swift.h"
будет именем проекта из шага 8. Полезно, если имя вашего проекта содержит специальные символы, и вы не уверены, как именно вы должны его отформатировать.
Если вы используете 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
отличается в зависимости от имени вашего проекта или другой цели, которую вы могли бы добавить и запустить на нем.
Первый шаг:-
Выберите 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 в файлы 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 4, а затем добавленные файлы Objective-C, сделайте это следующим образом:
@objcMembers
public class MyModel: NSObject {
var someFlag = false
func doSomething() {
print("doing something")
}
}
Ссылка: https://useyourloaf.com/blog/objc-warnings-upgrading-to-swift-4/
Просмотрите предварительные заметки о Swift и Objective C в том же проекте
Вы должны импортировать
#import "SCLAlertView-Swift.h"
The name of this header is your product module name followed by adding "-Swift.h".
То есть, это не имя класса, как вы написали, а имя модуля вашего продукта, и он заботится об импорте всех быстрых файлов, а не только определенного
Найдите «Имя заголовка сгенерированного интерфейса Objective-C» в настройках сборки цели, которую вы пытаетесь построить (скажем, так MyApp-Swift.h
), и импортируйте значение этого параметра (#import "MyApp-Swift.h"
) в исходный файл, к которому вы пытаетесь получить доступ. ваши Swift API.
Значение по умолчанию для этого поля $(SWIFT_MODULE_NAME)-Swift.h
. Это можно увидеть, если дважды щелкнуть в поле значения параметра «Имя заголовка сгенерированного интерфейса Objective-C».
Кроме того, если у вас есть тире в имени вашего модуля (скажем так My-App
), то $(SWIFT_MODULE_NAME)
все черточки будут заменены подчеркиванием. Итак, вам придется добавить #import "My_App-Swift.h"
.
Если вы хотите использовать файл Swift в Objective-C классе , то, начиная с Xcode 8, вы можете выполнить следующие шаги:
Если вы создали проект в Objective-C:
Скомпилируйте его, и если он сгенерирует ошибку компоновщика, например: скомпилирован с более новой версией языка Swift (3.0), чем предыдущие файлы (2.0) для архитектуры x86_64 или armv 7
Сделайте еще одно изменение в вашем
Построй и беги.
Будьте осторожны с черточками и подчеркиванием, они могут быть перепутаны, и имя вашего проекта и имя цели не будут совпадать с SWIFT_MODULE_NAME.
#import <TargetName-Swift.h>
вы увидите, когда войдете с клавиатуры #import <и после автоматически Xcode сообщит вам об этом.
Найдите файл .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