Ras*_*sto 14 objective-c iphone-privateapi ios quartz-core swift
如何调用非公共iOS函数并从Swift访问非公共属性?具体来说,我想在QuartzCore框架中使用一个非公共类.
我想到的一个解决方案是创建"桥接"Objective-C项目,将非公共API包装到公共API中,然后从Swift中调用这个Objective-C函数.但是,我的解决方案现在是纯粹的Swift,我宁愿保持这种方式.有没有更坚定的方式?(例如向Objective-C桥接头文件添加内容)
注意:我知道你在想什么,私有API是私有的,因为它们不应该被使用.我知道风险,我知道所有的烦恼,应用程序商店限制等.经过仔细考虑和大量的研究,不幸的是,这似乎仍然是这个特殊情况下的最佳方式.
The*_*ant 18
如果您的项目在Objective-C中,您可以执行相同的技巧.
创建一个头文件,并在类上声明一个类别的声明,以及您希望公开的私有方法的声明.然后,告诉Swift编译器导入此桥接头.
出于演示目的,我将在NSBigMutableString私有子类的内部进行讨论NSMutableString,我将调用它的_isMarkedAsImmutable方法.
请注意,这里,整个类本身是私有的,因此我必须首先将其声明为其真实超类的子类.因此,我可以在类本身的声明中声明方法; 然而,这并不会证明使用(Private)技巧类别.
如果你的课程是公开的,那么显然你只需要这个类别,你就不需要(重新)声明这个类本身.
Bridge.h:
#import <Foundation/Foundation.h>
@interface NSMutableString (Private)
- (BOOL)_isMarkedAsImmutable; // this is a lie
@end
@interface NSBigMutableString : NSMutableString
@end
Run Code Online (Sandbox Code Playgroud)
s.swift:
let s = NSBigMutableString()
println(s._isMarkedAsImmutable())
Run Code Online (Sandbox Code Playgroud)
编译并运行:
$ xcrun -sdk macosx swiftc -o foo -import-objc-header Bridge.h s.swift
$ ./foo
false
$
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7094 次 |
| 最近记录: |