ato*_*nda 20 runtime swizzling swift
在Swift之前,在Objective-C中,我会在类中调用或挂钩方法<objc/runtime.h>.
如果有人有任何关于修改Swift的运行时和挂钩函数的信息,比如CydiaSubstrate和其他帮助这个领域的库,请通知我.
mba*_*liy 36
我在Swift中使用方法调配成功了.此示例显示如何在NSDictionary上挂钩描述方法
我的实施:
extension NSDictionary {
func myDescription() -> String!{
println("Description hooked")
return "Hooooked " + myDescription();
}
}
Run Code Online (Sandbox Code Playgroud)
调色代码:
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
}
Run Code Online (Sandbox Code Playgroud)
编辑: 此代码适用于任何继承自NSObject的自定义Swift类(但不适用于不支持的类.)更多示例 - https://github.com/mbazaliy/MBSwizzler
ipm*_*mcc 19
你很可能会在没有任何问题的情况下调用从Objective-C类继承的swift生成的类,因为它们似乎一直使用动态方法调度.您可以通过跨桥传递在Objective-C运行时中存在的快速定义的类的方法,但Objective-C方法可能只是通过桥接到swift的代理 - 边运行时,所以不清楚它们是否特别有助于调整它们.
"纯粹的"快速方法调用似乎不是通过任何类似的方式动态调度的objc_msgSend,并且看起来(来自简短的实验)swift的类型安全性在编译时实现,并且大部分实际类型信息不存在(即消失)在运行时为非类型类型(这两种类型都可能有助于swift的速度优势.)
出于这些原因,我认为有意义的混合swift-only方法将比调整Objective-C方法更难,并且可能看起来mach_override比Objective-C方法更加混乱.
| 归档时间: |
|
| 查看次数: |
16596 次 |
| 最近记录: |