Swift如何无需指定签名即可传递任意C函数的地址?
解决方案
你可以通过Swift的泛型+@convention(c)约束实现这个通用转换函数,无需每次手动指定完整的C函数签名:
func convertToUInt64<T>(_ fn: @convention(c) T) -> UInt64 { return unsafeBitCast(fn, to: UInt64.self) } // 直接调用即可,无需显式声明函数签名 let addr = convertToUInt64(SecItemCopyMatching)
原理说明
- 泛型
T可以匹配任意C函数的签名类型,@convention(c)约束确保传入的参数是遵循C调用约定的函数,这是Swift识别C函数的关键标记。 unsafeBitCast负责将C函数指针直接转换为UInt64类型(当前iOS/macOS等主流平台均为64位,指针宽度与UInt64完全匹配)。
注意事项
unsafeBitCast属于不安全操作,仅在明确需要传递函数地址的场景下使用,确保目标平台的指针宽度与UInt64兼容(现代平台基本都满足)。
内容的提问来源于stack exchange,提问作者gkpln3
相关产品推荐
相关产品推荐

