框架内的私有Swift和ObjC依赖

时间:2017-05-25 12:41:13

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

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

  

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

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

1 个答案:

答案 0 :(得分:1)

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

  

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

请参阅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的方法和属性。由于它们在编译时不可用,因此您可以通过使用类扩展a.k.a匿名类别让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