【问题标题】:Can´t get the SecKey UnsafeMutablePointer in iOS Swift无法在 iOS Swift 中获取 SecKey UnsafeMutablePointer
【发布时间】:2015-01-04 22:05:27
【问题描述】:

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

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

我试图将指针定义为:

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

但是编译器抱怨 Cannot invoke 'init' with an argument type of @lvalue SecKey 错误

根据 Using Swift with Cocoa and Objective-C 一书,在 Core FoundationUnmanaged Objects 部分中,它指出Unmanaged&lt;T&gt; 结构提供takeUnretainedValue()takeRetainedValue() 2 个方法。但试图实现它们,会出现以下错误

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

“SecKey”没有名为“takeRetainedValue”的成员

任何解决此问题的帮助将不胜感激

【问题讨论】:

    标签: ios encryption swift rsa unmanaged


    【解决方案1】:

    试试这个:

    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&lt;Unmanaged&lt;SecKey&gt;?&gt;。正如this document中提到的,

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

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

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

    【讨论】:

      【解决方案2】:

      对于 Swift 2.1,它不适用于非托管,正确的版本是:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-11-11
        • 1970-01-01
        • 1970-01-01
        • 2015-07-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多