在框架中我们使用Swift和ObjC,以便在ObjC方法中实例化Swift实例。为了能够这样做,我们必须将这些swift文件公开/打开,因此它们出现在SWIFT_INSTALL_OBJC_HEADER(OurModule-Swift.h)中,然后由ObjC导入。 问题是我们想从框架的公共接口隐藏那些Swift类。 Apple说:
对于框架目标,只有
public
或open
修饰符的声明才会出现在生成的标题中。您仍然可以在框架的Objective-C部分中使用使用internal
修饰符标记的Swift方法和属性,只要它们在从Objective-C类继承的类中声明即可。有关访问级别修饰符的更多信息,请参阅Swift编程语言中的访问控制(Swift 3.1)。
所以理论上应该可以从ObjC创建内部swift类,但它似乎不起作用。有什么想法吗?
答案 0 :(得分:1)
您引用的文档仅提及内部方法和属性,而不是类。同样的文档也在不同的部分说:
将Swift导入Objective-C用内部标记的Swift方法和属性 修饰符,并在继承自Objective-C的类中声明 Objective-C运行时可以访问class。但是,他们不是 在编译时可访问,并且不会出现在生成的标头中 用于框架目标。
因此,您可以创建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