无法为Unmanaged< AnyObject>调用初始化程序?没有争论的迅速 [英] cannot invoke initializer for Unmanaged<AnyObject>? with no arguments in swift

查看:269
本文介绍了无法为Unmanaged< AnyObject>调用初始化程序?没有争论的迅速的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想要的是快速地将RSA Sec密钥转换为base64编码的字符串.所以我initialized像下面这样的变量,

what I want is to convert RSA Sec key into base64 encoded string with swift. so I initialized a variable like below,

var publicKeyBits = Unmanaged<AnyObject>?()

然后它给出

无法为非托管"调用初始化程序吗?没有参数 迅速

cannot invoke initializer for Unmanaged? with no arguments in swift

我想像下面那样隐蔽我的publickey

I want to covert my publickey like below

var publicKeyBits = Unmanaged<AnyObject>?()
SecItemCopyMatching(queryAttrs, &publicKeyBits)

let opaqueBits = publicKeyBits?.toOpaque() 
let publicKeyData = Unmanaged<NSData>.fromOpaque(opaqueBits).takeUnretainedValue()

let publicKeyBase64 = publicKeyData.base64EncodedData(NSDataBase64EncodingOptions.Encoding64CharacterLineLength)

错误.任何想法.

推荐答案

SecItemCopyMatching被声明为

public func SecItemCopyMatching(_ query: CFDictionary,
                               _ result: UnsafeMutablePointer<CFTypeRef?>?) -> OSStatus

,因此您必须将CFTypeRef?的地址作为inout参数传递. (在早期的Swift版本中,此函数返回了一个非托管对象, 不再是这种情况了.)

so you have to pass the address of a CFTypeRef? as inout argument. (In early Swift versions this function returned an unmanaged object, that is no longer the case.)

您以CFTypeRef(AnyObject的类型别名)形式检索该项目,然后将其转换为实际类型.示例:

You retrieve the item as a CFTypeRef (a typealias for AnyObject) and then cast it to the actual type. Example:

var result: CFTypeRef?
let status = SecItemCopyMatching(queryAttrs, &result)
if status == errSecSuccess {
    if let publicKeyData = result as? Data {
        let base64 = publicKeyData.base64EncodedString()
    }
}

这篇关于无法为Unmanaged&lt; AnyObject&gt;调用初始化程序?没有争论的迅速的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆