混合语言框架

Mixed language framework

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

据我所知,我不应该有一个桥接头文件 class,而是将我所有的包含文件都放在伞头文件中(据我所知是 )。

所以我在MyKit.h中写道:

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

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

#import <MyKit/ControllerObjectD-Swift.h>

?

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

文档说 "Swift will see every header you expose publicly in your umbrella header." 当我将框架导入其他项目时确实如此,但框架项目无法编译,因为它没有看到它。我已经打开 "Define Modules" 构建设置。

是不是我对伞头有什么误解?我在哪里可以说 "hi project, this is the umbrella header file"?如果我将 umbrella 头文件设置为桥接头文件,框架会编译,但这听起来像是我回到了开头?

干杯

尼克

我认为您需要执行 bridging-header 才能访问 swift 中的 obj-c 代码。 link 中的更多内容 https://developer.apple.com/library/ios/documentation/Swift/Conceptual/BuildingCocoaApps/MixandMatch.html

所以它是一个文件,其中包含您从 obj-c 传输到 swift 的导入。名字非常重要,所以要关心它。希望对你有帮助

p.s。您还需要将此 header 路径添加到您的项目设置

我认为您的问题可能出在 Swift class 中的访问修饰符,但是我已经编写了一个简短的指南和示例项目来帮助您:

可以找到示例项目here

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

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

1。将 Objective-C 导入 Swift

例如,如果您有一个名为 Player 的 Objective-C class,您想要将其添加到一个名为 swift class 的 Game.

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

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

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

    #import <Framework/Player.h>
    

确保 Objective-C 中的 Player 头文件在框架中被标记为 public 目标成员:

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

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 class 导入到Player 对象中,我们可以遵循类似的过程。

  1. 和以前一样;在 Build Settings 下的 Packaging 中,确保该框架目标的 Defines Module 设置设置为 Yes。

  1. 将 Swift 代码从该框架目标导入到该框架目标内的任何 Objective-C .m 文件中,使用以下语法并替换适当的名称:

    #import <ProductName/ProductModuleName-Swift.h>
    

    在我的例子中,它的作用是:

    #import <SwiftObjC/SwiftObjC-Swift.h>
    

    我假设,对你来说:

    #import <MyKit/MyKit-Swift.h>
    

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

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

上的工作原理

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

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

所以你的 public swift class 需要扩展 NSObject 例如。