iOS平台能否实现类似JavaScript中函数对象转字符串的功能?
iOS中获取函数源码的可能性
首先明确说:iOS平台(无论是Swift还是Objective-C)并没有像JavaScript里Function.prototype.toString()那样能直接获取函数完整源码的原生API。下面分两种语言具体说明:
Swift 情况
你尝试的String(describing:)只能拿到函数的类型签名信息,比如定义这样的函数:
func sum(a: Int, b: Int) -> Int { return a + b }
调用String(describing: sum)会输出类似(Int, Int) -> Int或者带模块名的(Swift.Int, Swift.Int) -> Swift.Int,完全看不到函数体的源码。
这是因为Swift编译后会把源码信息从二进制中剥离(除非你开启了调试符号,但即使有,也没有原生API能直接解析出源码)。编译后的函数已经变成了机器码,运行时没有保留源码文本。
Objective-C 情况
Objective-C虽然是动态语言,有Runtime可以获取方法的元信息,但也只能拿到方法的名字、参数类型、返回值类型这些签名信息,拿不到方法实现的源码。比如用Runtime API获取方法:
#import <objc/runtime.h> - (NSInteger)sum:(NSInteger)a b:(NSInteger)b { return a + b; } // 获取方法信息 Method method = class_getInstanceMethod([self class], @selector(sum:b:)); SEL sel = method_getName(method); const char* typeEncoding = method_getTypeEncoding(method); NSLog(@"SEL: %@, Type Encoding: %s", NSStringFromSelector(sel), typeEncoding);
输出的只是方法名和类型编码,完全没有函数体内容。同样,编译后的OC方法也变成了机器码,源码不会留在二进制里。
替代方案
如果确实需要在运行时获取自己编写的函数源码,只能手动做一些额外工作:
- 手动把函数体写成字符串常量和函数绑定,比如:
func sum(a: Int, b: Int) -> Int { return a + b } let sumSource = "func sum(a: Int, b: Int) -> Int { return a + b }"
这种方式需要开发者自己维护字符串和函数的一致性,比较麻烦。
- 调试阶段,你可以用LLDB命令查看源码:比如输入
source list -n sum,如果项目有调试符号,LLDB会显示该函数的源码,但这只能在调试时用,不能在APP运行时通过代码调用。
内容的提问来源于stack exchange,提问作者IOSDevops
相关产品推荐
相关产品推荐

