无法在iOS Swift中获取SecKey UnsafeMutablePointer

时间:2014-11-08 01:23:39

标签: ios encryption swift rsa unmanaged

我在swift项目中工作,涉及RSA加密,我遇到了如下指针问题:

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

我正在尝试将指针定义为:

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

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

根据使用Swift with Cocoa和Objective-C 一书,在核心基础非托管对象部分中,它指出Unmanaged<T>结构提供了两种方法takeUnretainedValue()takeRetainedValue()。但试图实现它们,会出现以下错误

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

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

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

2 个答案:

答案 0 :(得分:5)

试试这个:

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的存储左值,它作为左值的地址传递
  •   
  • 输入输出[类型]值,作为指向数组开头的指针传递,并在调用期间延长生命周期
  •   

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

答案 1 :(得分:1)

对于Swift 2.1,它不使用Unmanaged,正确的版本是:

var publicKey: SecKey?
var privateKey: SecKey?

let dic:[String:String] = [kSecAttrKeyType:kSecAttrKeyTypeRSA, kSecAttrKeySizeInBits:"2048"]
SecKeyGeneratePair(dic, &publicKey, &privateKey)