我正在迅速处理一个涉及RSA加密的项目,并且遇到了如下指针问题:

我有一个全局var publicKey: SecKey?可选值,我需要获取指向它的UnsafeMutablePointer<Unmanaged<SecKey>?>指针,这是SecKeyGeneratePair函数所需的数据类型。

我试图将指针定义为:

var keyPointer = UnsafeMutablePointer<Unmanaged<SecKey>?>(publicKey!)

但是编译器抱怨无法使用类型为@lvalue SecKey 的参数调用'init'错误

根据《将Swift与Cocoa结合使用》和《 Objective-C 》一书,在 Core Foundation的非托管对象部分中,它指出Unmanaged<T>结构提供了两种方法takeUnretainedValue()takeRetainedValue()。但是尝试实现它们,会出现以下错误
var keyPointer = UnsafeMutablePointer<Unmanaged<SecKey>?>(publicKey!.takeRetainedValue())

'SecKey'没有名为'takeRetainedValue'的成员

任何帮助解决这个问题将不胜感激

最佳答案

试试这个:

var publicKey: SecKey?
var privateKey: SecKey?

var publicKeyUnManaged:Unmanaged<SecKey>?
var privateKeyUnManaged:Unmanaged<SecKey>?
let dic:[String:String] = [kSecAttrKeyType:kSecAttrKeyTypeRSA, kSecAttrKeySizeInBits:"2048"]
SecKeyGeneratePair(dic, &publicKeyUnManaged, &privateKeyUnManaged)

publicKey = publicKeyUnManaged?.takeRetainedValue()
privateKey = privateKeyUnManaged?.takeRetainedValue()

您不必手动创建UnsafeMutablePointer<Unmanaged<SecKey>?>。如this document中所述,

当一个函数被声明为采用UnsafeMutablePointer参数时,它可以接受以下任何一个:


  • nil,作为空指针
  • 传递
  • UnsafeMutablePointer值
  • 一个进出表达式,其操作数是一个存储的Type类型的左值,作为左值
  • 的地址传递
  • 一个in-out [Type]值,作为指向数组开头的指针传递,并在调用
  • 的持续时间内延长生命周期


    在这种情况下,我们可以使用第三个“in-out”表达式。

    10-08 08:46