【问题标题】:Private Swift and ObjC dependencies inside framework框架内的私有 Swift 和 ObjC 依赖项
【发布时间】:2017-10-26 03:01:00
【问题描述】:

在框架中,我们使用 Swift 和 ObjC,因此 Swift 实例在 ObjC 方法中实例化。为此,我们必须将这些 swift 文件公开/打开,以便它们出现在 SWIFT_INSTALL_OBJC_HEADER (OurModule-Swift.h) 中,然后由 ObjC 导入。 问题是我们想从框架的公共接口中隐藏那些 Swift 类。苹果说:

对于框架目标,只有带有publicopen 修饰符的声明才会出现在生成的标头中。您仍然可以在框架的 Objective-C 部分中使用标记有 internal 修饰符的 Swift 方法和属性,只要它们是在从 Objective-C 类继承的类中声明的。有关访问级别修饰符的更多信息,请参阅 Swift 编程语言 (Swift 3.1) 中的访问控制。

所以理论上应该可以从 ObjC 创建内部 swift 类,但它似乎不起作用。有什么想法吗?

【问题讨论】:

    标签: objective-c swift cocoa interop llvm-clang


    【解决方案1】:

    您引用的文档仅提及内部方法和属性,而不是类。相同的文档还说,在不同的部分:

    Swift 方法和属性标记为内部 修饰符并在继承自 Objective-C 的类中声明 Objective-C 运行时可以访问该类。然而,他们不是 在编译时可访问并且不会出现在生成的标头中 用于框架目标。

    请参阅 https://developer.apple.com/library/content/documentation/Swift/Conceptual/BuildingCocoaApps/MixandMatch.html#//apple_ref/doc/uid/TP40014216-CH10-ID122 将 Swift 导入到 Objective-C 中

    因此,您可以创建 Swift 类 public,因此它们可以在框架的 Objective-C 部分中使用,但保留这些类的方法和属性 internal。由于它们在编译时不可用,因此您可以通过使用类扩展(也称为匿名类别)让 Objective-C 代码知道它们。

    假设您有以下要隐藏其实现的 Swift 类:

    public class SecretSwiftClass : NSObject {    
        func swiftFun(arg1 a : Int32, arg2 b : Int32) -> Int32 {
            return a + b
        }
    }
    

    在您的框架的 Objective-C 代码中,您可以使用内部的 swiftFun() 方法,如下所示:

    #import "YourProduct-Swift.h"
    
    // Use an extension to let the compiler know about the hidden method
    @interface SecretSwiftClass ()
    -(int32_t)swiftFunWithArg1:(int32_t)l arg2:(int32_t)m;
    @end
    
    // You will make this one visible to client code via the
    // framework's umbrella header
    @implementation PublicOCClass : NSObject
    
    -(int32_t) ocFun:(int32_t)int1 :(int32_t)int2 {
        SecretSwiftClass * sc = [[SecretSwiftClass alloc] init];
        return [sc swiftFunWithArg1:int1 arg2: int2];
    }
    
    @end
    

    【讨论】:

    • 我猜它可以工作,但它似乎很难维护并且需要大量的手动工作。与developer.apple.com/library/content/documentation/MacOSX/… 完全相同,您可以在其中限制 API,但仍然手动生成/编写导出文件似乎不是最好的选择。
    • 有没有人找到可以生成这些样板接口的工具?
    猜你喜欢
    • 1970-01-01
    • 2016-05-27
    • 2012-11-17
    • 2015-11-11
    • 2012-09-01
    • 2012-12-21
    • 1970-01-01
    • 1970-01-01
    • 2015-04-19
    相关资源
    最近更新 更多