objective-c - 从 ObjectiveC 静态库访问预编译的 Swift.Framework

标签 objective-c swift static-libraries bridging-header swift-framework

我有一个 3d 派对预编译的 swift 框架,我们称它为 SomeCoolSwiftFramework(没有源代码访问权限,只有框架),我需要在我自己的 Objective-C 静态库中使用它(它是我场景中的一个要求)。我已经创建了一个 Objective-C 静态库,我们称它为 MyCoolObjCLibrary,将框架拖放到那里并在我想使用该框架的地方创建一个新类:

@import Foundation;
@import SomeCoolSwiftFramework;
#import <SomeCoolSwiftFramework/SomeCoolSwiftFramework-Swift.h>
#import "MyCoolObjCLibrary.h"


@implementation MyCoolObjCLibrary

- testMe: NSString {
    // I want to access classes from SomeCoolSwiftFramework here but cannot see them.
    // `SomeCoolSwiftFramework` is not accessible here
    return @"ObjC Value";
}

@end

如果我没有创建 ObjC 静态库,而是切换到 swift 静态库,它工作正常,我可以看到所需的类和方法。但就我而言,我不得不使用 ObjC 静态库,因此想了解如何从静态库访问 swift 框架。

我在添加对 3d 零件框架的依赖项时是否遗漏了任何步骤?

最佳答案

原来是因为 3d 派对 SDK SomeCoolSwiftFramework没有遵循正确公开 ObjC 使用的必需类的规则,生成的 header 没有必需的声明,我看不到它们。

ObjC 使用 Swift 成员的规则是:

  • 标有public 的类(class)或成员
  • 类继承NSObject
  • 一个标有objc(<name>)的类
  • 标有objc的成员

为了克服 3d 派对框架的这个限制,我创建了自己的 swift 框架 SomeCoolSwiftFrameworkProxy使用 3d 方依赖项,公开我的代码所需的所有 API,应用上面的规则并确保 SomeCoolSwiftFrameworkProxy-Swift.h已正确生成并具有所需的声明。一旦完成,我就可以导入生成的 SomeCoolSwiftFrameworkProxy-Swift.h在我的 ObjC 静态库(或我的 ObjC 代码中的任何其他地方)中创建文件并访问所需的代理类/方法。

我的代理 Swift 框架声明如下:

import Foundation;
import SomeCoolSwiftFramework;

@objc(SomeCoolSwiftFrameworkProxy)
public class SomeCoolSwiftFrameworkProxy : NSObject {

    @objc
    public func init() {
        // access 3d party SDK methods/classes
        SomeCoolSwiftFrameworkClass.sharedInstance.init()
    }
}

我找到了 this blog post这回答了我的问题

关于objective-c - 从 ObjectiveC 静态库访问预编译的 Swift.Framework,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58210328/

相关文章:

ios - UIImageView 拉伸(stretch)整个 UITableViewCell 的行高

ios - 如何在 Swift 中实现 "share button"

ios - 如何更改 View Controller 的类类型?

linux - 链接到静态库后 undefined reference

iOS for Android View.GONE setVisibility 模式

ios - 在 AVAssetReader 中获取 Exc_Bad_access

objective-c - 您如何为大纲 View 提供交替的行颜色?

objective-c - 如何从 UITableViewCell 推送 View

android - 如何查看android静态库的ABI?

java - 如何在 Unix/Linux 中使用 java 获取正在运行的进程详细信息