我在Swift中编写了一个库,但我无法将其导入到用Objective-C编写的当前项目中。
有没有办法导入它?
#import "SCLAlertView.swift" - 'SCLAlertView.swift' file not found
你需要导入TargetName-Swift.h
。请注意,它是目标名称 - 其他答案错误地使用了类名。
这个单独的文件是一个自动生成的头文件,它为项目中所有使用@objc
注释或从NSObject
继承的Swift类定义Objective-C接口。
注意事项:
My Project
变为My_Project-Swift.h
)<TargetName/TargetName-Swift.h>
在同一个项目中查看有关Swift和Objective C的预发行说明
你应该导入
#import "SCLAlertView-Swift.h"
在您尝试构建的目标的构建设置中搜索“Objective-C Generated Interface Header Name”(假设它是MyApp-Swift.h
),并在您尝试的源文件中导入此设置的值(#import "MyApp-Swift.h"
)访问您的Swift API。
该字段的默认值为$(SWIFT_MODULE_NAME)-Swift.h
。如果双击“Objective-C Generated Interface Header Name”设置的值字段,则可以看到它。
此外,如果您的模块名称中有破折号(假设它是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
再做一次改变吧
构建并运行。
#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
Apple网站上的说明:
从同一框架将Swift代码导入Objective-C
在“构建设置”下的“打包”中,确保将该框架目标的“定义模块”设置设置为“是”。使用此语法将该框架目标中的Swift代码导入该框架目标中的任何Objective-C .m文件并替换相应的名称:
#import“ProductName-Swift.h”
修订:
您只能在.m文件中导入“ProductName-Swift.h”。
目标中的Swift文件将在包含此import语句的Objective-C .m文件中可见。
要避免循环引用,请不要将Swift导入Objective-C头文件。相反,您可以转发声明Swift类以在Objective-C头中使用它。请注意,您不能在Objective-C中子类化Swift类。
这是做什么的:
.swift
文件
将出现一个弹出窗口,询问“您是否要配置Objective-C桥接标头”。
选择是。#import "YourProjectName-Swift.h"
注意:每当您想要使用Swift文件时,必须按照以下行导入:
#import "YourProjectName-Swift.h"
转到项目文件中的构建设置并搜索“Objective-C生成的接口标题名称。该属性的值是您应该包含的名称。
如果您的“产品模块名称”属性(默认情况下上述属性所依赖的属性)取决于您是否编译test / debug / release / etc(就像我的情况一样),那么使此属性独立于此通过设置自定义名称进行更改。
在Swift
中导入Objective-c
文件会导致此错误,如果它没有正确import
。
注意:您不必在外部导入Swift文件,只需导入一个文件来处理swift文件。
在Objective-C项目中创建/复制Swift文件时。它会自动创建一个桥接头。
在Objective-C Generated Interface Header Name
查看Targets -> Build Settings
。
基于上面,我将原样导入KJExpandable-Swift.h
。
你的将是TargetName-Swift.h
,其中TargetName
根据你的项目名称或你可能已添加并运行的其他目标而有所不同。
第一步:-
选择项目目标 - >构建设置 - >搜索('定义') - >定义模块更新值否为是
“定义模块”:是的。
“始终嵌入Swift标准库”:是的。
“安装Objective-C兼容性标题”:是。
第二步:-
在Objective C“.h”文件中添加Swift文件类,如下所示
#import <UIKit/UIKit.h>
@class TestViewController(Swift File);
@interface TestViewController(Objective C File) : UIViewController
@end
在Objective C“.m”文件中导入'ProjectName(您的项目名称)-Swift.h'
//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_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/