Ios 混合语言框架

Ios 混合语言框架,ios,objective-c,swift,frameworks,Ios,Objective C,Swift,Frameworks,我有一个用Objective-C编写的框架(我们称之为MyKit),我正在用一些Swift类扩展它。我正试图通过以下文档了解它: 据我所知,我不应该有一个桥接头类,而是将我所有的include放在伞形头文件中(据我所知是这样的) 所以我在MyKit.h中写道: #import <MyKit/ModelObjectA.h> #import <MyKit/ModelObjectB.h> #import <MyKit/ControllerObjectC.h> #导

我有一个用Objective-C编写的框架(我们称之为MyKit),我正在用一些Swift类扩展它。我正试图通过以下文档了解它:

据我所知,我不应该有一个桥接头类,而是将我所有的include放在伞形头文件中(据我所知是这样的)

所以我在MyKit.h中写道:

#import <MyKit/ModelObjectA.h>
#import <MyKit/ModelObjectB.h>
#import <MyKit/ControllerObjectC.h>
#导入
#进口
#进口
我没有列出ControllerObjectD.swift,即使它也在这里?或者我应该包括

#import <MyKit/ControllerObjectD-Swift.h>
#导入
?

ControllerObject使用ModelObjectA和ModelObjectB。既然我没有桥头文件,我在其中得到了编译错误,因为它找不到这些对象

文档中说“Swift将看到您在伞式标题中公开的每个标题。”当我将框架导入其他项目时,这是正确的,但框架项目无法编译,因为它看不到它。我已经打开了“定义模块”构建设置

也许我对伞头有些误解了吧?我在哪里可以说“嗨,项目,这是伞头文件”?如果我将伞形头文件设置为桥接头文件,框架将编译,但这听起来像是这样回到了开头

干杯


Nik

我认为您需要使用桥接头才能在swift中访问obj-c代码。 更多链接

因此,这是一个从obj-c导入并传输到swift的文件。名字很重要,所以要小心。希望能有帮助


p、 您还需要将此标题路径添加到项目设置中

我相信您的问题可能在于Swift类中的访问修饰符,不过我已经编写了一个简短的指南和示例项目来帮助您:

样本项目可以找到

混合语言框架由两部分组成:

  • 将Objective-C导入Swift
  • 将Swift导入Objective-C

  • 1.将Objective-C导入Swift 例如,如果您有一个名为
    Player
    的Objective-C类,您希望将其添加到名为
    Game
    的swift类中

    根据文档,您需要执行以下两个步骤才能将
    Player
    对象导入
    Game
    对象

  • 在“生成设置”下的“打包”中,确保该框架目标的“定义模块”设置设置设置为“是”
  • 在伞形头文件中,导入要向Swift公开的每个Objective-C头

    #import <Framework/Player.h>
    

    2.将Swift导入Objective-C 要将Swift
    Game
    类导入
    Player
    对象,我们可以遵循类似的过程

  • 一如既往;在“生成设置”下的“打包”中,确保该框架目标的“定义模块”设置设置设置为“是”
  • 使用以下语法将Swift代码从该框架目标导入该框架目标内的任何Objective-C.m文件,并替换相应的名称:

    #import <ProductName/ProductModuleName-Swift.h>
    
    #导入
    
    在我的情况下,其作用如下:

    #import <SwiftObjC/SwiftObjC-Swift.h>
    
    #导入
    
    我想,对你来说:

    #import <MyKit/MyKit-Swift.h>
    
    #导入
    
    因此,请确保要访问的所有属性、方法和类在swift文件中都定义为public,否则它们对Objective-C不可见

  • 我已经上传了我的示例项目,展示了这一切是如何在GitHub上运行的


    我希望这能帮助您解决问题。

    来自苹果公司的文档:Swift类必须是Objective-C类的后代,才能在Objective-C中访问和使用。有关您可以从Objective-C访问什么以及如何导入Swift接口的更多信息,请参阅Swift类型兼容性


    例如,您的公共swift类需要扩展NSObject。

    框架目标中不允许使用桥接头。虽然我很想知道为什么。经过半天的“试错”和浏览解决方案后。这是解释得最恰当的答案。这对我很有帮助,非常感谢。有没有办法让斯威夫特看到类,而不将它们暴露在伞头中?我有一些我不想向框架用户公开的内部类,但是我不能在新的Swift类中访问它们。我不相信有任何方法可以做到这一点。我还没有找到一种方法。有人知道是否可以用cocoa touch静态库做完全相同的事情吗?将Swift导入Objective-C时,是否可以避免Swift类公开?
    #import <MyKit/MyKit-Swift.h>