混合语言框架

时间:2015-02-27 08:56:34

标签: ios objective-c swift frameworks

我有一个用Objective-C编写的框架(让我们称之为MyKit),我用一些Swift类扩展。我尝试使用此文档来了解它:https://developer.apple.com/library/ios/documentation/Swift/Conceptual/BuildingCocoaApps/MixandMatch.html#//apple_ref/doc/uid/TP40014216-CH10-XID_77

据我了解,我不应该有一个桥接头类,而是将所有包含放在伞头文件中(我理解为)。

所以我在MyKit.h中写道:

#import <MyKit/ModelObjectA.h>
#import <MyKit/ModelObjectB.h>
#import <MyKit/ControllerObjectC.h>

我没有列出ControllerObjectD.swift,即使它也进入了这里?或者我应该包括

#import <MyKit/ControllerObjectD-Swift.h>

ControllerObjectD使用ModelObjectA和ModelObjectB。既然我没有桥头文件,我就会收到编译错误,因为它找不到这些对象。

文档说&#34; Swift会在你的标题栏中看到你公开展示的每个标题。&#34;当我将框架导入其他项目时,这是正确的,但框架项目无法编译,因为它没有看到它。我打开了#34;定义模块&#34;建立设置。

是否有一些我对伞头的误解?我在哪里可以说&#34;在项目中,这是伞头文件&#34;?如果我将伞头文件设置为桥接头,那么框架会编译,但这听起来像是我以这种方式回到了开头?

干杯

的Nik

3 个答案:

答案 0 :(得分:30)

我相信您的问题可能归结为Swift课程中的Access Modifiers,但是我已经编写了一个简短的指南和示例项目来帮助您:

可以找到示例项目here

拥有混合语言框架有两个部分:

  1. 将Objective-C导入Swift
  2. 将Swift导入Objective-C

  3. 1。将Objective-C导入Swift

    例如,如果您有一个名为Player的Objective-C类要添加到名为Game的快速类中。

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

    1. 在“构建设置”下的“打包”中,确保将该框架目标的“定义模块”设置设置为“是”。
    2. Defines Module

      1. 在您的伞形头文件中,导入要向Swift公开的每个Objective-C标头。

        #import <Framework/Player.h>
        
      2. 确保Objective-C中的Player头文件标记为框架中的公共目标成员身份:

        Public Header File Setting

        按照这些步骤,可以将Player Objective-C类导入Game Swift类:

        import UIKit
        
        public class Game: NSObject {
            public let player: Player
        
            public init(player: Player) {
                self.player = player
                super.init();
            }
        } 
        

        2。将Swift导入Objective-C

        为了将Swift Game类导入Player对象,我们可以遵循类似的过程。

        1. 和以前一样;在“构建设置”下的“打包”中,确保将该框架目标的“定义模块”设置设置为“是”。
        2. Defines Module

          1. 使用此语法将该框架目标中的Swift代码导入该框架目标中的任何Objective-C .m文件并替换相应的名称:

            #import <ProductName/ProductModuleName-Swift.h>
            

            在我的情况下,这适用于:

            #import <SwiftObjC/SwiftObjC-Swift.h>
            

            我假设,为你:

            #import <MyKit/MyKit-Swift.h>
            

            因此,请确保您要访问的所有属性,方法和类在swift文件中定义为public,否则它们不会对Objective-C可见。

          2. 我上传了我的示例项目,展示了这一切是如何在GitHub https://github.com/elliott-minns/SwiftObjCTestFramework

            上运行的

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

答案 1 :(得分:1)

我认为您需要使用bridging-header来访问swift中的obj-c代码。 更多链接 https://developer.apple.com/library/ios/documentation/Swift/Conceptual/BuildingCocoaApps/MixandMatch.html

所以它是一个文件,你从obj-c转移到swift的导入。名字非常重要所以要小心。希望它有所帮助

P.S。您还需要将此标题路径添加到项目设置

答案 2 :(得分:1)

来自Apple的文档:Swift类必须是Objective-C类的后代才能在Objective-C中访问和使用。有关可以从Objective-C访问的内容以及如何导入Swift界面的更多信息,请参阅Swift类型兼容性。

所以你的公共swift类需要扩展NSObject例如。