混合语言框架

nik*_*ers 10 frameworks objective-c ios swift

我有一个用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>
Run Code Online (Sandbox Code Playgroud)

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

#import <MyKit/ControllerObjectD-Swift.h>
Run Code Online (Sandbox Code Playgroud)

ControllerObjectD使用ModelObjectA和ModelObjectB.现在我没有桥头文件,我在其中遇到编译错误,因为它找不到这些对象.

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

也许是我对伞头问题误解了吗?我在哪里可以说"喜项目,这是伞头文件"?如果我将伞头文件设置为桥接头,那么框架会编译,但这听起来像是我以这种方式回到了开头?

干杯

Ell*_*nns 30

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

示例项目可以在这里找到

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

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

1.将Objective-C导入Swift

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

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

  1. 在"构建设置"下的"打包"中,确保将该框架目标的"定义模块"设置设置为"是".

定义模块

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

    #import <Framework/Player.h>
    
    Run Code Online (Sandbox Code Playgroud)

确保PlayerObjective-C中的头文件标记为框架中的公共目标成员身份:

公共头文件设置

按照这些步骤,可以将PlayerObjective-C类导入GameSwift类:

import UIKit

public class Game: NSObject {
    public let player: Player

    public init(player: Player) {
        self.player = player
        super.init();
    }
} 
Run Code Online (Sandbox Code Playgroud)

2.将Swift导入Objective-C

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

  1. 像之前一样; 在"构建设置"下的"打包"中,确保将该框架目标的"定义模块"设置设置为"是".

定义模块

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

    #import <ProductName/ProductModuleName-Swift.h>
    
    Run Code Online (Sandbox Code Playgroud)

    就我而言,这适用于:

    #import <SwiftObjC/SwiftObjC-Swift.h>
    
    Run Code Online (Sandbox Code Playgroud)

    我假设,为你:

    #import <MyKit/MyKit-Swift.h>
    
    Run Code Online (Sandbox Code Playgroud)

    因此,请确保要访问的所有属性,方法和类在swift文件中定义为public,否则Objective-C将无法看到它们.

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

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

  • 有谁知道可可触摸静态库是否有可能做完全相同的事情? (2认同)