创建密钥对(私有,公共)
的函数Cannot convert value of type 'inout Unmanged<SecKey>?' ... expected argument type 'UnsafeMutablePointer<SecKey?> ...'
加注
sound
当我查看the api for SecKeyGeneratePair时,这听起来publicKeyPtr, privateKeyPtr
,所以我们可以更改public func generateKeyPair(publicKeyTag: String, privateKeyTag:String, keySize: Int) -> KeyPair ? {
let privateKeyAttr: [String: AnyObject] = [
kSecAttrIsPermanent as String: kCFBooleanTrue,
kSecAttrApplicationTag as String: privateKeyTag
]
let publicKeyAttr: [String: AnyObject] = [
kSecAttrIsPermanent as String: kCFBooleanTrue,
kSecAttrApplicationTag as String: publicKeyTag
]
let parameters: [String: AnyObject] = [
kSecAttrKeyType as String: kSecAttrKeyTypeRSA,
kSecAttrKeySizeInBits as String: keySize,
kSecPrivateKeyAttrs as String: privateKeyAttr,
kSecPublicKeyAttrs as String: publicKeyAttr
]
var publicKeyPtr: UnsafeMutablePointer<SecKey?> = nil
var privateKeyPtr: UnsafeMutablePointer<SecKey?> = nil
let result = SecKeyGeneratePair(parameters, publicKeyPtr, privateKeyPtr)
if( result != errSecSuccess ){
return nil
}
let publicKey = Unmanaged<SecKey>.fromOpaque(COpaquePointer(publicKeyPtr)).takeRetainedValue()
let privateKey = Unmanaged<SecKey>.fromOpaque(COpaquePointer(privateKeyPtr)).takeRetainedValue()
publicKeyPtr.destroy()
privateKeyPtr.destroy()
return KeyPair(publicKey: publicKey, privateKey: privateKey)
}
的类型:
Thread 1: EXC_BAD_INSTRUCTION (code=EXC_i386_INVOP, ...
但是当我使用该函数时,publicKey和privateKey会引发:
(
当我插入断点时,我意识到指针(`publicKeyPtr,privateKeyPtr)永远不会被设置。
那么如何将swift 1.2代码迁移到swift 2.0?
答案 0 :(得分:2)
尝试:
public func generateKeyPair(publicKeyTag: String, privateKeyTag:String, keySize: Int) -> KeyPair? {
let privateKeyAttr: [NSString: AnyObject] = [
kSecAttrIsPermanent: true,
kSecAttrApplicationTag: privateKeyTag
]
let publicKeyAttr: [NSString: AnyObject] = [
kSecAttrIsPermanent: true,
kSecAttrApplicationTag: publicKeyTag
]
let parameters: [NSString: AnyObject] = [
kSecAttrKeyType: kSecAttrKeyTypeRSA,
kSecAttrKeySizeInBits: keySize,
kSecPrivateKeyAttrs: privateKeyAttr,
kSecPublicKeyAttrs: publicKeyAttr
]
var publicKey: SecKey?
var privateKey: SecKey?
let result = SecKeyGeneratePair(parameters, &publicKey, &privateKey)
if result != errSecSuccess {
return nil
}
return KeyPair(publicKey: publicKey!, privateKey: privateKey!)
}
您可以将&
表达式传递给UnsafeMutablePointer
个参数。