You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 20:06:24