如何访问Swift中的iOS私有API?

我怎样才能调用非公开的iOSfunction,并从Swift访问非公有的特性? 具体来说,我想在QuartzCore框架中使用一个非公共类。

我想到的一个解决scheme是创build“桥接”Objective-C项目,将这些非公开的API封装到公共API中,而不是从Swift中调用这个Objective-C函数。 不过,我的解决scheme现在是纯Swift,我宁愿保持这种方式。 还有没有更加坚定的方法? (例如添加一些Objective-C桥接头文件 )

注: 我知道你在想什么,私人API是私人的,因为它们不应该被使用。 我知道风险,我知道所有的地方,应用程序商店的限制等。毕竟,仔细考虑和大量的研究,不幸的是,似乎仍然是在这种情况下最好的办法。

如果你的项目在Objective-C中,你可以做同样的技巧。

创build一个头文件,并把类的声明,以及你想要公开的私有方法的声明。 然后,告诉Swift编译器导入这个桥接头。

出于演示目的,我将在NSBigMutableString的私有子类NSBigMutableString的内部进行NSBigMutableString ,我将调用它的_isMarkedAsImmutable方法。

请注意,在这里,整个类本身是私有的,因此我必须首先将它声明为它的真正的超类的子类。 正因为如此,我也可以在宣布这个阶级本身时宣布这个方法是对的。 但是,这并不能certificate(Private)欺骗类别的使用。

如果你的class级是公开的,那么显然你只需要这个class级,而且你不需要(重新)宣布class级本身。

Bridge.h:

 #import <Foundation/Foundation.h> @interface NSMutableString (Private) - (BOOL)_isMarkedAsImmutable; // this is a lie @end @interface NSBigMutableString : NSMutableString @end 

s.swift:

 let s = NSBigMutableString() println(s._isMarkedAsImmutable()) 

编译并运行:

 $ xcrun -sdk macosx swiftc -o foo -import-objc-header Bridge.h s.swift $ ./foo false $ 

您可以使用NSClassFromString:获取私有类NSClassFromString:并使用performSelector与它们交互。