我有一些Swift 3代码来解码iOS Objective-C协议(它有一个Swift对应物)。在得出Swift 3结论之后,反射还没有发展到足以完成我需要的东西,我偶然发现了objc运行时方法protocol_copyMethodDescriptionList()
,它返回了以下C结构的数组:
struct objc_method_description
SEL name;
char *types;
};
代码提取协议选择器名称列表,但不确定type
字段中返回的内容。我对如何正确解码objc_method_description.type
值感到困惑。
我在type
字段中获得的内容是一种神秘的格式,例如,"B48@0:8@16{_NSRange=QQ}24@40"
起初我认为这是我转换C字符串的问题,但在一些之后研究,我怀疑它实际上是参数的编码,类似于Java的JVM如何绕过方法签名。但我仍然没有参考解码它。
import UIKit
class ViewController: UIViewController, UITextViewDelegate {
@IBOutlet weak var noteView : UITextView!
func decodeProto() {
var methodCount : UInt32 = 1
if let methodList = protocol_copyMethodDescriptionList(UITextViewDelegate.self,
false, true, UnsafeMutablePointer<UInt32>(&methodCount)) {
for i in 0..<Int(methodCount) {
let methodDesc = methodList[i];
let name = methodDesc.name
let types = String(validatingUTF8: methodDesc.types)
print("\(name) \(types)")
}
}
}
override func viewDidLoad() {
super.viewDidLoad()
decodeProto()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
}
XCode控制台中的输出是:
可选(
textViewDidBeginEditing:
)可选(“v24 @ 0:8 @ 16”)
可选(textViewDidEndEditing:
)可选(“v24 @ 0:8 @ 16”)
可选(textViewShouldBeginEditing:
)可选(“B24 @ 0:8 @ 16”)
可选(textViewShouldEndEditing:
)可选(“B24 @ 0:8 @ 16”)
可选(textView:shouldChangeTextInRange:replacementText:
)可选(“B48 @ 0:8 @ 16 {_NSRange = QQ} 24 @ 40”)
可选(textView:shouldChangeTextInRange:replacementText :)可选(“B48 @ 0:8 @ 16 {_NSRange = QQ} 24 @ 40”)
。
。
。
答案 0 :(得分:5)
返回objc_method_description.type
字段的内容是什么?
换句话说,要从type
字段获取可用的方法签名编码,只需从左到右的顺序提取字母符号字符,丢弃数字。< / p>
支持文件: