Swift调用Objective-C decrypt函数时Data转UnsafeMutablePointer<Int8>报错求助
解决Swift调用Objective-C decrypt函数的参数传递问题
嗨,我来帮你搞定这个问题~咱们先拆解下报错的根源,再一步步修正代码。
为什么会编译失败?
你Objective-C里的函数声明是:
-(char *)decrypt:(char *)crypt el:(int)el{}
这里的char *crypt作为输入参数,在Swift里会被自动映射成UnsafePointer<Int8>(只读指针),而你在withUnsafeBytes里用了UnsafeMutablePointer<Int8>(可变指针),类型不匹配自然就编译报错啦。
正确的转换和调用方式
咱们需要把Base64解码后的Data安全转换成UnsafePointer<Int8>,再传给OC函数。另外注意Swift 5+里withUnsafeBytes的用法有更新,直接上可运行的代码:
// 1. 确保Base64解码成功,同时初始化你的OC类实例 if let resultData = Data(base64Encoded: base64String), let tea = YourTeaClassName() { // 2. 确认el参数:这里假设el是加密数据的字节长度,也就是resultData的count let el = resultData.count // 3. 安全获取Data的指针并调用OC函数 let decryptedPtr = resultData.withUnsafeBytes { buffer -> UnsafeMutablePointer<Int8>? in // 把原始字节缓冲区转成Int8类型的指针 guard let baseAddr = buffer.baseAddress else { return nil } let int8Ptr = baseAddr.assumingMemoryBound(to: Int8.self) // 调用decrypt函数,OC返回的char*会被Swift转成UnsafeMutablePointer<Int8>? return tea.decrypt(int8Ptr, el: el) } // 4. 处理解密后的结果(重点注意内存管理!) if let decryptedPtr = decryptedPtr { // 把指针转成可读的字符串 let decryptedString = String(cString: decryptedPtr) // 重要:如果OC函数是用malloc/calloc动态分配的内存,必须手动释放! free(decryptedPtr) } }
几个关键注意事项
- 内存管理:一定要确认OC的
decrypt函数返回的char*内存分配方式。如果是动态分配的(比如用malloc),你必须在Swift里用free()释放,否则会造成内存泄漏;如果返回的是常量字符串或OC内部管理的内存,就不用手动处理。 - el参数准确性:要保证你传入的
el和OC函数期望的一致——通常是加密数据的字节长度,也就是resultData.count,别传错数值哦。 - 空值安全:解码后的
resultData和OC类实例都要做非空判断,避免运行时崩溃。
内容的提问来源于stack exchange,提问作者udi
相关产品推荐
相关产品推荐

