无法为 Unmanaged<AnyObject> 调用初始化程序?迅速没有争论
Posted
技术标签:
【中文标题】无法为 Unmanaged<AnyObject> 调用初始化程序?迅速没有争论【英文标题】:cannot invoke initializer for Unmanaged<AnyObject>? with no arguments in swift 【发布时间】:2017-08-22 09:35:56 【问题描述】:我想要的是用swift将RSA
Sec
键转换为base64
编码字符串。所以我initialized
一个像下面这样的变量,
var publicKeyBits = Unmanaged<AnyObject>?()
然后它给了
无法为非托管调用初始化程序?没有争论 很快
我想像下面这样隐藏我的publickey
var publicKeyBits = Unmanaged<AnyObject>?()
SecItemCopyMatching(queryAttrs, &publicKeyBits)
let opaqueBits = publicKeyBits?.toOpaque()
let publicKeyData = Unmanaged<NSData>.fromOpaque(opaqueBits).takeUnretainedValue()
let publicKeyBase64 = publicKeyData.base64EncodedData(NSDataBase64EncodingOptions.Encoding64CharacterLineLength)
错误。任何想法。
【问题讨论】:
@MartinR 完成,请检查 @MartinR,试过它给-50
status
-50
为“参数错误”,表示查询无效。这是一个不同的问题。
【参考方案1】:
SecItemCopyMatching
被声明为
public func SecItemCopyMatching(_ query: CFDictionary,
_ result: UnsafeMutablePointer<CFTypeRef?>?) -> OSStatus
所以你必须将CFTypeRef?
的地址作为 inout 参数传递。
(在早期的 Swift 版本中,这个函数返回一个非托管对象,
现在已经不是这样了。)
您将项目检索为CFTypeRef
(AnyObject
的类型别名),然后将其转换为实际类型。示例:
var result: CFTypeRef?
let status = SecItemCopyMatching(queryAttrs, &result)
if status == errSecSuccess
if let publicKeyData = result as? Data
let base64 = publicKeyData.base64EncodedString()
【讨论】:
【参考方案2】:你需要检查Unmanaged类的初始化,可能有一些初始化参数。
var publicKeyBits = Unmanaged<AnyObject>("mykey")
【讨论】:
Unmanaged
根本没有(公共)初始化方法。以上是关于无法为 Unmanaged<AnyObject> 调用初始化程序?迅速没有争论的主要内容,如果未能解决你的问题,请参考以下文章
坚持使用hasSpaceAvailable并且无法从NSInputStream中读取
Unmanaged.passUnretained(self).toOpaque() 到 Swift 3
C#EXE w / Unmanaged C ++ Unicode DLL链接到非托管C ++ ANSI DLL崩溃
使用 Hibernate Unmanaged JPA 在 Equinox OSGI 框架中获取 EntityManagerFactory