我已经用Swift编写了一个库,我无法将它导入到我当前的项目中,这是用Objective-C编写的。
有什么方法可以导入它吗?
1
| #import"SCLAlertView.swift" - 'SCLAlertView.swift' file not found |
您需要导入TargetName-Swift.h。注意,它是目标名称-其他答案会犯使用类名的错误。
这个单独的文件是一个自动生成的头文件,它为项目中所有Swift类定义了Objective-C接口,这些类要么用@objc注释,要么从NSObject继承。
考虑事项:
- 请注意,如果您尝试在导入中使用swift文件名,则在顶级声明符之后会出现错误"expected';"。在您的SWIFT文件后,"进口基金会"。
- 哇,好极了!小问题:有没有什么地方我能看到那个项目的名字?我尝试了你的建议,但仍然有错误,所以我担心我可能有项目名称错误。
- 编辑:注意:要使此工作,必须定义项目模块名称。请参阅:stackoverflow.com/a/24064015/2085743
- 我只是想添加一个注释,如果您的项目名称有任何空白或特殊字符,您必须用下划线替换它们,如"我的应用程序"将是"my-app-swift.h"
- 您好,@bill如何在目标C项目中通过cocoapod使用swift库…?
- 这在框架目标中是如何工作的,您可以将import添加到伞头中吗?
- 为什么这是如此困难和记录不足?
- @hardikamal您仍然可以使用,例如,在objective-c类中使用#import"SCLAlertView-Swift.h",或@import ;。
- @Uchuugaka没那么难。第一次你会感到有点疼痛,然后你会逐渐掌握它。
- 谢谢!真的有帮助!
- 我在.m中使用了#import"SCLAlertView-Swift.h",我出错了:SCLAlertView-Swift.h not found我做错了什么?
- @是的,重读我的答案
- @比尔,现在我用的是#import"Wow_Dictionary-Swift.h",其中Wow Dictionary是我的项目名称。现在我出错了。还有什么问题吗?
- @实际上,它是目标名称,而不是项目名称。让我更新我的答案。
- @Bill我的项目名称与目标名称相同。
- 我这样做了,但是我得到了10个编译错误,说No type or protocol UIApplicationDelegate和类似的
- 是否必须将其导入到.m文件中?
- @Johnottenlips是的
- 这个自动生成的文件现在叫做TargetName-Bridging-Header.h?
- @不,那个文件和这个相反。桥接头是由开发人员编写的,允许您将objective-c和c符号引入到swift代码中。目标swift.h文件是自动生成的,允许您的目标C/C代码访问swift符号。
- 不一定是Target Name。实际上是你在Build Settings中定义的Product Module Name。你可以看一下苏米特·辛格的回答
- @比尔很抱歉打扰你,但我一直试图导入Swift头文件,但无法成功。问题是我的项目中有两个目标。其中一个objective-c文件需要访问两个目标的swift头文件。我该怎么办?
- 您好@adeel您可以创建一个新的头文件,导入Target1-Swift.h和Target2-Swift.h,并将该头文件导入到目标C文件中。
- 在新创建的头文件中,它不允许我包含这两个文件中的任何一个。此外,如果我从一个目标中排除了objective-c文件,那么编译器就不再抱怨头文件,而是开始抱怨objc类的一个子类,因为这两个目标中都包含了它。
- 我找到了一个找到正确生成的头文件名的新方法:转到您的目标->构建设置->搜索关键字Objective-C Generated Interface Header Name,宾果!
- 重要提示:您可以更改每个目标的模块名称,使每个目标的swift头的名称相同。详情请点击此处->stackoverflow.com/a/27411394/956816
苹果网站上的说明:
To import Swift code into Objective-C from the same framework
Under Build Settings, in Packaging, make sure the Defines Module
setting for that framework target is set to Yes. Import the Swift code
from that framework target into any Objective-C .m file within that
framework target using this syntax and substituting the appropriate
names:
#import"ProductName-Swift.h"
修订:
只能在.m文件中导入"ProductName Swift.h"。
The Swift files in your target will be visible in Objective-C .m files
containing this import statement.
To avoid cyclical references, don’t import Swift into an Objective-C
header file. Instead, you can forward declare a Swift class to use it
in an Objective-C header. Note that you cannot subclass a Swift class
in Objective-C.
- 工作得很好
- 只有在.m文件中导入"productName swift.h"帮助了我。在.pch文件中添加相同内容时给出了"找不到'cllocationManagerDelegate'的协议声明;您的意思是'nslayoutManagerDelegate'?"
- 不使用.mm文件?
- @文件上说,Ajit并不是直接的。最简单的方法是创建一个Objective-C类,该类以Objective-C++理解的格式进行翻译。developer.apple.com/library/ios/documentation/swift/conceptu‌&8203;al/…
- 请注意,您必须从NSObject派生!!!!你不能直接用swift声明一个class Blah并让它工作。需要是class Blah : NSObject。
- 对于某些情况,值得阅读此答案:stackoverflow.com/questions/26328034/…,具体取决于您正在执行的操作:importimportimport
- 如果你想要导入一个Swift扩展怎么办?
- 在我的例子中,"ProductName-Swift.h"在xcode 7.3中工作得很好,但现在在xcode 8.3.2中工作。
- @Alejandrov&225;n我有uiview swift课程,可以吗?我无法将Swift导入目标C
- 缺失的模块是我的一个测试项目的问题。此外,如果您的项目名称以数字开头(例如1234.xcodeproj),它也会将第一个有问题的字符替换为uu,因此您的模块名称将默认为"234",因此您的include将类似于"234-swift.h"。
- "请注意,在Objective-C中不能将Swift类划分为子类。"感谢您将其包括在内,它使我免于疯狂。
以下是要做的:
在目标C中创建新项目
创建新的.swift文件nbsp;
- 将出现一个弹出窗口并询问"是否要配置Objective-C桥接头"。
- 选择"是"。
单击Xcode项目文件
单击"生成设置"
查找搜索栏并搜索定义模块。
将值更改为"是"。
搜索产品模块名称。
将该值更改为项目的名称。
应用程序内委托,增加以下内容:#import"YourProjectName-Swift.h"。
注意:每当您想使用您的swift文件时,必须导入以下行:
#import"YourProjectName-Swift.h"
- 把Build settings中Defines module的值改成Yes对我来说是固定的!
- 嵌入内容包含swift:是的,也使用这个
- 回答正确,但Xcode 7.3.1及更高版本不需要步骤7-8
- 为我工作!谢谢。
- 我跳过了第六步,即使它对我有用…这一步真的需要吗????我的定义模块设置为否
- 我在江户区不工作。在以前的版本中工作
- @Jose920405请告诉我您正在执行的步骤,因为相同Xcode版本的相同步骤对我有效。
- 只想补充一下,#import"YourProjectName-Swift.h"中的YourProjectName将是步骤8中项目的名称。如果您的项目名称包含特殊字符,并且您不确定应该如何精确地格式化它,则非常有用。
如果您在objc项目中使用cocoapods并尝试使用swift pod,那么只需执行以下操作:
@import ;
- 谢谢!你救了我一天。
- 如果我们通过可可安装Swift制造的图书馆,这就像一个魅力。恭喜!!!!
转到项目文件中的"构建设置"并搜索"Objective-C生成的接口头名称"。该属性的值是应该包括的名称。
如果您的"产品模块名称"属性(默认情况下,上述属性所依赖的属性)因您是否为测试/debug/release/etc编译而不同(与我的情况类似),则通过设置自定义名称使此属性独立于该变化。
如果在Objective-c中导入Swift文件不正确,可能会导致此错误。
注意:您不必从外部导入Swift文件,只需导入一个处理Swift文件的文件。
在Objective-C项目中创建/复制Swift文件时。它会自动创建一个桥接头。
在Targets -> Build Settings处检查Objective-C Generated Interface Header Name。
基于以上,我将按原样进口KJExpandable-Swift.h。
您的将是TargetName-Swift.h,其中TargetName根据您的项目名称或您可能添加并运行的其他目标而有所不同。
我的目标是KJExpandable,所以是KJExpandable-Swift.h。
第一步:
选择项目目标->构建设置->搜索("定义")->定义模块将值"否"更新为"是"
"定义模块":是。
"始终嵌入Swift标准库":是。
"Install objective-c compatibility header":是。
第二步:
在目标C".h"文件中添加swift文件类,如下所示
1 2 3 4 5 6 7
| #import <UIKit/UIKit.h>
@class TestViewController(Swift File);
@interface TestViewController(Objective C File) : UIViewController
@end |
在目标c.m文件中导入'project name(您的项目名称)-swift.h'
1 2 3 4 5 6
| //TestViewController.m
#import"TestViewController.h"
/*import ProjectName-Swift.h file to access Swift file here*/
#import"ProjectName-Swift.h" |
- 该类的转发声明(@class)是非常好的一点!谢谢!
如果在同一框架内将swift代码导入到objective-c文件中,有一个警告。必须指定框架名称和尖括号:
#import
MyFramework这里是"产品模块名称"构建设置(PRODUCT_NAME = MyFramework)。
简单地添加#import"MyFramework-Swift.h"是行不通的。如果您检查build products目录(在添加这样一个#import之前,所以您至少有一个成功的构建,目标中有一些swift代码),那么您仍然应该在Headers目录中看到文件MyFramework-Swift.h。
如果您在Swift 4中创建了一个项目,然后添加了Objective-C文件,请这样做:
1 2 3 4 5 6 7
| @objcMembers
public class MyModel: NSObject {
var someFlag = false
func doSomething() {
print("doing something")
}
} |
参考:https://useyourloaf.com/blog/objc-warnings-upgrading-to-swift-4/
- 在我的代码中,在我将它从Swift 3更新到Swift 4.2之后。它坏了
- 你犯了什么错误?我在swift4.2中使用了上述代码,它工作正常。
查看同一项目中关于Swift和Objective C的预发布说明
https://developer.apple.com/library/prerelease/ios/documentation/swift/conceptive/buildingcoaapps/mixandmatch.html//apple-ref/doc/uid/tp40014216-ch10-xid_
您应该导入
1
| #import"SCLAlertView-Swift.h" |
- 显示此错误:找不到"sclAlertView swift.h"文件。
- 必须是项目名,而不是文件名-请参阅我的答案。
- 感谢您提供文档链接。这对参考有用。
- 引用提供的链接:The name of this header is your product module name followed by adding"-Swift.h".,因此它不是您所写的类名,而是您的产品模块的名称,它负责导入所有swift文件,而不仅仅是一个特定的文件。
在您试图构建的目标的构建设置中搜索"Objective-C生成的接口头名称"(假设它是MyApp-Swift.h),并在您试图访问Swift API的源文件中导入此设置的值(#import"MyApp-Swift.h")。
此字段的默认值为$(SWIFT_MODULE_NAME)-Swift.h。如果双击"Objective-C Generated Interface Header Name"设置的"Value"字段,可以看到。
另外,如果您的模块名中有破折号(假设它是My-App),那么在$(SWIFT_MODULE_NAME)中,所有破折号都将替换为下划线。所以你必须加上#import"My_App-Swift.h"。
- 比批准的要好。冲刺浪费了20分钟,我再也回不来了,哈哈。
如果要将Swift文件用于Objective-C类,那么从Xcode 8开始,可以执行以下步骤:
如果您在目标C中创建了项目:
创建新的swift文件
Xcode将自动提示输入桥接头文件
生成它
在Objective-C控制器中导入"project name swift.h"(在实现中导入,而不是在接口中导入)(如果项目名称之间有空格,请使用下划线"project-name-swift.h")。
您将能够在swift中访问您的objective-c类。
编译它,如果它将生成链接器错误,例如:使用比以前的文件(2.0)更高版本的swift语言(3.0)编译架构x86_64或armv 7
在您的
xcode->project->target->build settings->use legacy swift language version->yes
建立和运行。
在项目中查找.pch文件。然后添加#import"YourProjectName-Swift.h",这将导入类头。这样就不必导入到特定文件中。
1 2 3 4 5 6 7 8 9 10
| #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 |