我想在Objective-C项目中开始使用Swift。所以我添加了一个快速的课程:
import Foundation
@objc class System : NSObject {
@objc func printSome() {
println("Print line System");
}
}
并将其导入.m文件:
#import "MyProjectName-Swift.h"
构建项目时出现以下错误:
Bridging header 'PathToMyProject/MyProjectName-Bridging-Header.h' does not exist
注意:在“Build Settings-> Swift Compiler - Code Generation-> Objective-C Briding Header”下设置为MyProjectName-Bridging-Header.h
我该怎么做才能解决这个问题?
非常感谢任何帮助。
编辑:Bridging-Header文件: #if defined(__ has_include)&& __has_include() #include #ENDIF
#include <objc/NSObject.h>
#include <stdint.h>
#include <stddef.h>
#include <stdbool.h>
#if defined(__has_include) && __has_include(<uchar.h>)
# include <uchar.h>
#elif __cplusplus < 201103L
typedef uint_least16_t char16_t;
typedef uint_least32_t char32_t;
#endif
#if !defined(SWIFT_PASTE)
# define SWIFT_PASTE_HELPER(x, y) x##y
# define SWIFT_PASTE(x, y) SWIFT_PASTE_HELPER(x, y)
#endif
#if !defined(SWIFT_METATYPE)
# define SWIFT_METATYPE(X) Class
#endif
#if defined(__has_attribute) && __has_attribute(objc_runtime_name)
# define SWIFT_RUNTIME_NAME(X) __attribute__((objc_runtime_name(X)))
#else
# define SWIFT_RUNTIME_NAME(X)
#endif
#if !defined(SWIFT_CLASS_EXTRA)
# define SWIFT_CLASS_EXTRA
#endif
#if !defined(SWIFT_PROTOCOL_EXTRA)
# define SWIFT_PROTOCOL_EXTRA
#endif
#if !defined(SWIFT_CLASS)
# if defined(__has_attribute) && __has_attribute(objc_subclassing_restricted)
# define SWIFT_CLASS(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) __attribute__((objc_subclassing_restricted)) SWIFT_CLASS_EXTRA
# else
# define SWIFT_CLASS(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA
# endif
#endif
#if !defined(SWIFT_PROTOCOL)
# define SWIFT_PROTOCOL(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) SWIFT_PROTOCOL_EXTRA
#endif
#if !defined(SWIFT_EXTENSION)
# define SWIFT_EXTENSION(M) SWIFT_PASTE(M##_Swift_, __LINE__)
#endif
#if !defined(OBJC_DESIGNATED_INITIALIZER)
# if defined(__has_attribute) && __has_attribute(objc_designated_initializer)
# define OBJC_DESIGNATED_INITIALIZER __attribute__((objc_designated_initializer))
# else
# define OBJC_DESIGNATED_INITIALIZER
# endif
#endif
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wproperty-attribute-mismatch"
#if defined(__has_feature) && __has_feature(modules)
#endif
#pragma clang diagnostic pop
答案 0 :(得分:175)
如果桥接文件创建的级别与其他类相同,则可能需要添加相对路径,如这些图片所示。请注意,桥接文件创建的级别与其他类相同:
我在Build Settings中正确输入了名称,
但编译器找不到该文件。
因此,如果我从项目的根目录添加相对路径(即我添加./ProjectName/BridgerFileName.h
),
现在它编译,我可以在Objective C类中调用一个方法:
答案 1 :(得分:67)
我发现在手动创建桥接头文件并选择默认名称和位置后,桥接头将放在项目目录中,该目录位于根目录下。
这需要以下设置值:目标&gt; [您的应用目标]&gt;构建设置&gt; Swift编译器 - 代码生成&gt; Objective-C桥接标题:
$(SRCROOT)/$(PROJECT_NAME)/$(PROJECT_NAME)-Bridging-Header.h
请注意,如果您的项目是一个快速模块(框架),那么,正如评论中所指出的,您可能更喜欢:
$(SRCROOT)/$(PROJECT_NAME)/$(SWIFT_MODULE_NAME)-Bridging-Header.h
答案 2 :(得分:43)
与其他大多数答案相反,我的方式正好相反。我以前一直在使用桥接头,但我不再需要它了。我从项目中删除它后,我开始收到问题中提到的错误。我执行了以下步骤来解决我的问题。
答案 3 :(得分:15)
在 Swift 4.1
中您的项目没有bridging-Header.h
文件,但您的项目有该路径。为此,您需要删除该路径......
转到targets
文件并选择Build Settings
,----&gt; Swift Compiler - General
,然后删除bridging-Header.h
。按照以下屏幕截图....
删除Swift编译器中的bridging-Header.h
文件 - 常规
现在你有这样的......
答案 4 :(得分:13)
在Swift项目中添加Bridge文件。
步骤1.转到文件&gt;使用Objective-C文件添加Cocoa(用于临时目的)
现在按Create Bridging Header Button
完成强>
你将获得BIGLE中的BRIGDE文件
<强>感谢强>
答案 5 :(得分:12)
对我来说,它有助于在我的桥接头文件路径前使用$(SRCROOT)/ $(PROJECT_NAME)/
答案 6 :(得分:12)
这些是创建桥接标题的步骤。
文件 - &gt;新建 - &gt; iOS-&gt;标题文件,将桥接文件名称设置为“yourProjectName-Bridging-Header.h”
构建设置 - &gt; Objective-C桥接标题,只需将桥接头文件名称设为“ProjectName-Bridging-Header.h”
注意:桥接头文件应位于“.xcodeproj”文件所在项目的主根文件夹中。如果没有将Bridging头文件移动到项目的根文件夹。这样Xcode就能够访问桥文件。
构建项目,并在Bridging标头中导入必要的文件。
答案 7 :(得分:6)
对我而言,它有助于在我的Objective-C桥接标题路径前使用$(SRCROOT)
。
$(SRCROOT)/swiftLibraries/swiftLibraries-Bridging-Header.h
答案 8 :(得分:5)
请按照以下步骤操作:
也许这两件事有助于解决您的问题。
答案 9 :(得分:5)
以下对我有用:
答案 10 :(得分:2)
手动创建桥接头文件
首先删除创建Xcode的Bridging头文件。并选择您的项目转到&gt;构建设置&gt;搜索关键字。 Swift编译器 - 代码生成。单击Objective-C Bridging Header,删除该路径。现在清理你的项目。
现在选择你的项目&gt;导航栏中的窗口。选择项目并从那里删除派生数据。
选择您的项目转到&gt;构建设置&gt;搜索关键字。 Swift编译器 - 代码生成。单击Objective-C Bridging Header,现在在Objective-C Bridging Header中添加路径,如 projectname-Bridging-Header.h
现在将您的类导入到桥接头文件中,您可以轻松地将其编译为代码。
Your bridging header file looks like this when you are creating your file manually.
答案 11 :(得分:1)
帮助我的是手动将文件移动到错误消息中提到的路径。所以: