Objective c 在框架目标中使用Swift对目标C类进行子类化
我有一个框架目标,其中大多数类都是用Objective C编写的。最近,我们开始在代码中引入Swift文件。我们使用模块将私有的Objective C文件提供给swift代码(可以找到更多信息) 直到最近,当我尝试使用Swift对我的一个Objective C类进行子类化时,我在生成的Objective c 在框架目标中使用Swift对目标C类进行子类化,objective-c,swift,xcode,clang,language-interoperability,Objective C,Swift,Xcode,Clang,Language Interoperability,我有一个框架目标,其中大多数类都是用Objective C编写的。最近,我们开始在代码中引入Swift文件。我们使用模块将私有的Objective C文件提供给swift代码(可以找到更多信息) 直到最近,当我尝试使用Swift对我的一个Objective C类进行子类化时,我在生成的MyFramework Swift.h文件中发现一个错误,该文件说“找不到模块TestSwift”其中TestSwift是modulemap文件中提供的模块名称。但是,如果我尝试对框架的伞形标题中列出的类(公共类)
MyFramework Swift.h
文件中发现一个错误,该文件说“找不到模块TestSwift
”其中TestSwift
是modulemap
文件中提供的模块名称。但是,如果我尝试对框架的伞形标题中列出的类(公共类)进行子类化,它会起作用
import TestSwift
@objc public class NewSwiftClass: ExistingObjectiveCClass {
//throws error in the generated MyFramework-Swift.h file while compiling
}
如果我将swift类保持在内部,它就会工作
import TestSwift
@objc class NewSwiftClass: ExistingObjectiveCClass {
//works fine
}
但是我想在我的Objective C文件中使用这个Swift类,因此不能将其保存在内部
TL;DR:我无法在框架目标中使用Swift对现有的Objective C类进行子类划分。我认为这在Swift中是不可能的,因为在Objective-C中是不可能的 如果您的框架中有一个类
a
,它不是伞头的一部分,并且您希望B
将其子类化并位于伞头中,那么您就不能这样做
您必须在接口声明@interface B:A
中声明继承,它位于B的头中,因此位于伞形头中。但是编译器会抱怨:“A是什么?”您可以在那里导入A的头,但与Swift的导入
不同,Objective-C的#导入
实际上会将A头的内容放到B头中。这意味着A现在也在伞头中,即公共
把斯威夫特和Objective-C混为一谈并不是什么魔法。编译器仍然需要能够生成准确描述Swift接口的有效Objective-C头。所以,除非你能想出一种方法让Objective-C做到这一点,否则你不能用Swift做到
我能想到的唯一选择是把你的“是一个”关系变成“有一个”关系,即
@objc public class NewSwiftClass {
let parent: ExistingObjectiveCClass
}
显然,您失去了实际继承的大部分好处,但您仍然会有父级作为
super
的替代品。您还可以声明两个类都符合的公共协议,以确保它们的方法之间的一致性。谢谢,@Max因此,如果我理解正确,在1之前,我无法使用swift类对目标c类进行子类化。我将objective c接口(即.h文件)公开2。我将swift类设置为内部类。但是如果我们按照这个类比,我想知道如何在我的公共swift类中声明同一个私有objc类的公共属性?这是如何工作的?@SagarD没有限定符,正如在我的回答中一样,属性是内部的
,在框架外不可见。如果编译器抱怨,您可能必须显式地将其声明为private