framwork中的私有Swift和ObjC依赖

问题描述:

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

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

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

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

标有内部 改性剂和从一个Objective-C 类继承的类内声明夫特方法和属性的目标C访问运行。但是,它们不是在编译时可访问的 ,并且不会出现在为框架目标生成的标头 中。

请参阅导入斯威夫特成的Objective-C在https://developer.apple.com/library/content/documentation/Swift/Conceptual/BuildingCocoaApps/MixandMatch.html#//apple_ref/doc/uid/TP40014216-CH10-ID122

因此,你可以让雨燕类public,让他们在你的框架的Objective-C的部分可用,但要保持这些类internal的方法和属性。由于它们在编译时不可用,因此可以通过使用类扩展a.k.a匿名类别让Objective-C代码了解它们。

假设你有以下雨燕类,你要隐藏其实现:

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 
+0

我猜它的作品,但它似乎很难保持和大量的手动工作。与https://developer.apple.com/library/content/documentation/MacOSX/Conceptual/BPFrameworks/Tasks/ExportingInterfaces.html#//apple_ref/doc/uid/20002260-97049完全相同,您可以限制API但仍然从手生成/写入导出文件似乎不是最好的事情。 – Fishman