1

我有一个 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 零件框架的依赖项时,我是否错过了任何步骤?

4

1 回答 1

2

事实证明,因为 3d 方 SDKSomeCoolSwiftFramework没有遵循规则来正确公开 ObjC 使用的所需类,所以生成的标头没有必需的声明,我看不到它们。

ObjC 使用的 Swift 成员的规则是:

  • 标记为的类或成员public
  • 一个类继承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()
    }
}

我发现这篇博文回答了我的问题

于 2019-10-03T23:28:07.867 回答