在Swift之前,在Objective中,我会使用<objc/runtime.h>在类中使用swizzle或钩子方法。
如果有人有任何关于修改Swift的运行时和挂钩功能的信息,比如CydiaSubstrate和其他在这方面有帮助的库,请告诉我。
发布于 2014-06-04 22:31:50
我用斯威夫特的方法成功了。此示例演示如何在NSDictionary上挂钩描述方法。
我的实施:
extension NSDictionary {
func myDescription() -> String!{
println("Description hooked")
return "Hooooked " + myDescription();
}
}Swizzling代码:
func swizzleEmAll() {
var dict:NSDictionary = ["SuperSecret": kSecValueRef]
var method: Method = class_getInstanceMethod(object_getClass(dict), Selector.convertFromStringLiteral("description"))
println(dict.description) // Check original description
var swizzledMethod: Method = class_getInstanceMethod(object_getClass(dict), Selector.convertFromStringLiteral("myDescription"))
method_exchangeImplementations(method, swizzledMethod)
println(dict.description) //Check that swizzling works
}编辑:此代码将适用于从NSObject继承的任何自定义Swift类(但不适用于不适用的类)。更多示例- https://github.com/mbazaliy/MBSwizzler
发布于 2014-06-03 17:04:02
您很可能能够对继承自Objective类的快速生成的类进行分步操作,没有问题,因为它们似乎一直使用动态方法分派。您可能可以通过跨桥传递在目标-C运行时中存在的快速定义类的方法,但目标-C侧方法很可能只是跨桥到快速运行时的代理,因此不清楚是否特别有用。
“纯”快速方法调用似乎不会通过类似于objc_msgSend的任何东西动态地发送,而且(从简短的实验中)看来,swift的类型安全性是在编译时实现的,并且对于非类类型,在运行时缺少许多实际的类型信息(即已消失)(这两种信息都可能有助于swift的所谓速度优势)。
由于这些原因,我预计有意义的快速方法比目标C方法要困难得多,而且可能看起来更像mach_override而不是目标C方法。
https://stackoverflow.com/questions/24019683
复制相似问题