无法为 Unmanaged<AnyObject> 调用初始化程序?迅速没有争论

Posted

技术标签:

【中文标题】无法为 Unmanaged<AnyObject> 调用初始化程序?迅速没有争论【英文标题】:cannot invoke initializer for Unmanaged<AnyObject>? with no arguments in swift 【发布时间】:2017-08-22 09:35:56 【问题描述】:

我想要的是用swift将RSASec键转换为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,试过它给-50status -50 为“参数错误”,表示查询无效。这是一个不同的问题。 【参考方案1】:

SecItemCopyMatching 被声明为

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

所以你必须将CFTypeRef? 的地址作为 inout 参数传递。 (在早期的 Swift 版本中,这个函数返回一个非托管对象, 现在已经不是这样了。)

您将项目检索为CFTypeRefAnyObject 的类型别名),然后将其转换为实际类型。示例:

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中读取

.NET 无法在同一目录中找到非托管 DLL

Unmanaged.passUnretained(self).toOpaque() 到 Swift 3

无法使用 swift 在 iPhone 6 中注册远程通知

C#EXE w / Unmanaged C ++ Unicode DLL链接到非托管C ++ ANSI DLL崩溃

使用 Hibernate Unmanaged JPA 在 Equinox OSGI 框架中获取 EntityManagerFactory