在objective-c中导入swift类,找不到<myModule> -Swift.h文件
我有一个用Objective-C编写的iOS项目。 我在项目中创build了一个Swift类,在Swift中访问objective-c的桥接头文件已经成功生成,并且工作正常。
我的问题是相反的。 我想在Objective-C代码中导入Swift类。
在xcode中, 目标 – >构build设置 – > Swift编译器部分,我看到Objective-C Generated Interface Header Name
字段值myModule-Swift.h
,但是当我在我的Objective-C类中导入此标题:
#import "myModule-Swift.h"
我得到编译器错误:
myModule-Swift.h file not found
而在项目中,我也找不到这个文件。 我怎么解决这个问题?
我的xcode版本是6.4
-
去
构build设置 – > Objective-C生成的接口标题名称
并将值设置为YourModule-Swift.h(这通常已经设置,这是您需要导入.m文件#import "YourModule-Swift.h"
-
转到生成设置并search“定义模块”,将两个值都设置为YES
-
例如,用
@objc
前缀在swift中创build一个类
@objc class mySwiftClass{...}
-
转到窗口 – >项目,然后按“派生数据”上的删除button
-
再次build立该项目
-
现在应该工作。
为什么要添加@objc?
Swift类或协议必须使用@objc属性标记为可在Objective-C中访问和使用。
这个@objc
前缀告诉编译器生成一个头文件给你的swift类。 它会将它添加到“MyModule-Swift.h”文件中,例如:
@objc class MyCustomViewController : UIViewController {..}
会生成这样的代码:
SWIFT_CLASS("_TtC10MyCustomViewController4ViewController") @interface ViewController : UIViewController - (void)viewDidLoad; - (void)viewDidAppear:(BOOL)animated; - (void)didReceiveMemoryWarning; - (SWIFT_NULLABILITY(nonnull) instancetype)initWithNibName:(NSString * __nullable)nibNameOrNil bundle:(NSBundle * __nullable)nibBundleOrNil OBJC_DESIGNATED_INITIALIZER; - (SWIFT_NULLABILITY(nonnull) instancetype)initWithCoder:(NSCoder * __nonnull)aDecoder OBJC_DESIGNATED_INITIALIZER; @end
允许Objective-C知道这个类。
OMG ..实际的导入语句不是“class-Swift.h”,而是“projectname-Swift.h”
如果您在构build设置 – > Swift编译器代码生成 – > Objective-C生成的接口标题名称下查找,可以find该文件的名称
当我将Swift源文件拖入GUI时,文件没有生成。 只有当我右键单击 – >添加文件到“项目”。 然后它要求生成头文件。
对我来说,问题是我有bitcode。 当我点击“更新到推荐的项目设置”,它改变了一些可能是罪魁祸首的设置。 我在“生成设置”中将“已启用位代码”设置为“否”,现在已经修复。
我的除了丹尼尔克罗姆斯答案:
-
切勿将-Swift.h标题添加到标题。 即使它似乎工作。 仅将导入添加到.m文件!
-
如果你在你的头文件中使用swift类,在你的@interface之前用@class swiftclassname做一个前向声明
然后你会看到你的代码中真正的错误。
我昨天遇到同样的问题,工作了几个小时,无济于事。 其他人可能和我一样。我做了上述所有步骤,但没有任何成效。
破坏的原因是因为项目名称工件遍布我的项目(从以前更改其名称不正确)。
如果所有上述步骤都失败了,我会build议像我一样做,并重命名您的项目,以便Xcode可以重置一些东西…这解决了我的问题。 这样做就像一个魅力!
我已经堆叠了很长一段时间了。 在我的情况下,我的目标名称是像“我的应用程序”使用破折号作为目标名称的一部分。 我试图#import "my-app-Swift.h"
,但Xcode不断给我错误。
我挖掘“DerivedData”文件夹下,我发现“my_app-Swift.h”。 所以如果你使用一些有趣的字符作为目标名字。 您可以尝试用下划线_
replace那些。