CFError到NSError的免费桥接在Swift 3中不起作用

CFError到NSError的免费桥接在Swift 3中不起作用,swift,swift3,core-foundation,Swift,Swift3,Core Foundation,将我们的代码库转换为Swift 3时,我遇到了以下问题: ABAddressBookRequestAccessWithCompletion(addressBookRef) { (granted: Bool, error: CFError?) in DispatchQueue.main.async { if let nsError = error as NSError { ... }

将我们的代码库转换为Swift 3时,我遇到了以下问题:

ABAddressBookRequestAccessWithCompletion(addressBookRef) { (granted: Bool, error: CFError?) in
        DispatchQueue.main.async {

            if let nsError = error as NSError {
                ...   
            }
        }
}
编译器错误为:
无法将强制中类型为“CFError”的值转换为类型为“NSError”


改为:

if let nsError = error as? NSError { ... }

给出警告:
从'CFError'转换为不相关类型'NSError'总是失败

根本不要尝试通过NSError。强迫直接出错,Swift类型

if let err = error as? Error {
    print(err) // no problem
}

请原谅我指出这一点,但是ABAddressBook已被弃用。
如果让nsError=error作为错误?{…}
应该可以工作,但我目前无法测试它,正如@matt所说,该API已经被弃用了。@matt仍然支持iOS 8是的,我很担心(@Ramsel我为您提交了一个bug:小注释:如果让err=error作为错误?{…}如果
error
不能转换为
error?
@MartinR,编译器会抱怨。我能告诉你的是,当传入的
error
是可选的CFError时,上面的代码会正确编译并运行。这是最初的问题,所以这就是我解决的问题。是的,我对此毫不怀疑。