从Swift生成的Objective-C头文件

8 浏览
0 Comments

从Swift生成的Objective-C头文件

我遇到了一个关于从Swift类生成的ObjC头文件(Project-Swift.h)的问题。

头文件包含了定义的Swift类的表示以及所需依赖的所有导入。实际上,我将ObjC与Swift结合在一个项目中。一切都很正常,直到我想从外部框架创建Swift类ABCTableViewController的子类XYZTableViewController时。

来自Swift文件的类定义:

@objc class XYZTableViewController: ABCTableViewController { ... }

Project-Swift.h生成的内容:

SWIFT_CLASS("_TtC6Abc22XYZTableViewController")
@interface XYZTableViewController : ABCTableViewController
- (nullable instancetype)initWithCoder:(NSCoder * _Nonnull)aDecoder OBJC_DESIGNATED_INITIALIZER;
- (nonnull instancetype)initWithNibName:(NSString * _Nullable)nibNameOrNil bundle:(NSBundle * _Nullable)nibBundleOrNil OBJC_DESIGNATED_INITIALIZER;
- (nonnull instancetype)initWithStyle:(UITableViewStyle)style OBJC_DESIGNATED_INITIALIZER;
@end

编译完成后出现以下错误:

Project-Swift.h:140:37: 找不到“ABCTableViewController”的接口声明,它是“XYZTableViewController”的父类;您是不是想要“UITableViewController”?

如果我在外部框架的.m文件中导入模块并定义相关类类型的属性,则可以正常工作。

有没有人遇到过这个问题或其他类似的问题?

0
0 Comments

在项目结构中,我发现了一个问题。我不知道为什么,但是项目中包含了未使用的ObjC++源代码.mm,在这种情况下,编译器会忽略项目设置,并且不会生成模块。

这个问题的出现可能是由于项目中包含了未使用的ObjC++源代码.mm文件。由于这些文件没有被使用,编译器会忽略它们并且不会生成模块。这可能会导致一些问题,例如无法正确导入头文件。

解决这个问题的方法是删除项目中未使用的ObjC++源代码.mm文件。可以通过以下步骤来完成:

1. 打开项目文件夹,并找到未使用的ObjC++源代码.mm文件。

2. 右键点击文件,并选择“删除”选项。

3. 确认删除操作,将文件移动到回收站或者彻底删除。

删除这些未使用的源代码文件后,编译器将不再忽略项目设置,并且可以正确生成模块。

如果您仍然遇到问题,可以参考以下相关页面获取更多帮助:use of when modules are disabled

希望这些信息对您有所帮助。如果您还有其他问题,请随时提问。

0
0 Comments

从上述内容中可以得出以下结论:

问题的原因是Objective-C无法继承Swift类。这是由于Objective-C和Swift的语言特性不同所致。在Swift中,可以通过继承来创建子类,但在Objective-C中,无法直接继承Swift类。

问题的解决方法是可以在Objective-C中实现一个Swift协议。这样,可以通过遵循该协议来使用Swift类的功能,实现类似继承的效果。

根据内容中的描述,问题是在生成的头文件中出现的。这意味着在转换Swift代码为Objective-C时,生成的头文件中包含了Swift类的定义。由于Objective-C无法继承Swift类,所以在Objective-C中无法直接使用这个生成的头文件中的类定义。

文章整理如下:

Objective-C无法继承Swift类的问题原因及解决方法

根据Apple官方文档《Using Swift with Cocoa and Objective-C》中的描述,我们得知在Objective-C中无法继承Swift类。这是由于Objective-C和Swift的语言特性不同所致。在Swift中,可以通过继承来创建子类,但在Objective-C中,无法直接继承Swift类。

然而,有一种解决方法是可以在Objective-C中实现一个Swift协议。这样,可以通过遵循该协议来使用Swift类的功能,实现类似继承的效果。

虽然我们了解到这个限制,但是问题是在生成的头文件中出现的。这意味着在转换Swift代码为Objective-C时,生成的头文件中包含了Swift类的定义。由于Objective-C无法继承Swift类,所以在Objective-C中无法直接使用这个生成的头文件中的类定义。

Objective-C无法继承Swift类的问题可以通过在Objective-C中实现一个Swift协议来解决。这样可以通过遵循协议来使用Swift类的功能。然而,需要注意的是,在生成的头文件中包含了Swift类的定义,而Objective-C无法直接使用这个生成的头文件中的类定义。

0