如何访问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与它们交互。