Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 在框架目标中使用Swift对目标C类进行子类化_Objective C_Swift_Xcode_Clang_Language Interoperability - Fatal编程技术网

Objective c 在框架目标中使用Swift对目标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文件中提供的模块名称。但是,如果我尝试对框架的伞形标题中列出的类(公共类)

我有一个框架目标,其中大多数类都是用Objective C编写的。最近,我们开始在代码中引入Swift文件。我们使用模块将私有的Objective C文件提供给swift代码(可以找到更多信息)

直到最近,当我尝试使用Swift对我的一个Objective C类进行子类化时,我在生成的
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