unsafeBitCast 是 Swift 中的一个低级函数,用于在不进行类型检查的情况下强制把一个值转换成另一个类型的值。
函数定义
func unsafeBitCast<T, U>(_ x: T, to type: U.Type) -> U
T 是原始类型。
U 是目标类型。
它不会检查类型是否兼容,也不会做任何转换逻辑,只是按内存位级别强制解释。
例如:
let callback: AXObserverCallback = { observer, element, notification, context in
print("通知:\(notification)")
}
// 将 Swift 闭包转换成函数指针(AXObserverCallback 类型)
let callbackPointer = unsafeBitCast(callback, to: AXObserverCallback.self)
这在 Swift 中不推荐直接这么用,但很多 macOS 辅助功能 API 还没升级到现代 Swift 的类型系统时,只能用这种方式绕过类型限制。
使用场景
这个函数的使用场景非常有限,主要用于:
1、桥接底层 C API(如 Core Foundation、Core Graphics、AXObserverCallback 等);
2、在非常特殊的性能优化场景下;
3、对象指针类型的转换(比如 UnsafeMutableRawPointer 转换成某个对象类型);
4、Swift 和 C/C++/Objective-C 互操作时(如 AXObserverCallback 是 C 函数指针)。
注意事项
1、绝对不能用错:如果类型大小或布局不匹配,程序会崩溃或行为不可预期。
2、不安全:如果你不确定某个转换是否合法,请避免使用。
总结
unsafeBitCast 用于 Swift 中强制把一个值转换成另一个类型的值,但是在Swift中并不推荐该方法,可以考虑以下几种替代方案:
1、as?:类型可选转换(失败会返回 nil);
2、as!:强制类型转换(失败会崩溃);
3、withUnsafePointer(to:) / Unmanaged<T>:当与 C API 交互时使用。
相关文章
1、Swift类型检查运算符(is、as、Type):https://fangjunyu.com/2025/06/25/swift%e7%b1%bb%e5%9e%8b%e6%a3%80%e6%9f%a5%e8%bf%90%e7%ae%97%e7%ac%a6%ef%bc%88is%e3%80%81as%e3%80%81type%ef%bc%89/