下调“ Any”时出现Swift错误

cya*_*ide 5 downcast optional-values swift

以下代码几乎是Apple Documentation的精确复制品,编译时没有错误:

guard let firstItem = (rawItems! as? Array<Dictionary<String, Any>>)?.first else {
    throw AnError()
}

let identityRef = firstItem[kSecImportItemIdentity as String] 
               as! SecIdentity?   // !!!

guard let identity = identityRef else {
    throw AnError()
}
Run Code Online (Sandbox Code Playgroud)

标有的行!!!包含强制向下转换,而替换as!as显然会导致编译错误'Any?' is not convertible to 'SecIdentity?'...确实SecIdentity是一个类,Any甚至可能不是一个类。

我真正无法解释的是以下内容。如果我尝试使代码更安全,请使用此

guard let idenity = firstItem[kSecImportItemIdentity as String] as? SecIdentity
else {
    throw AnError()
}
Run Code Online (Sandbox Code Playgroud)

或这个

guard let idenityRef = firstItem[kSecImportItemIdentity as String] as? SecIdentity?
else {
    throw AnError()
}
Run Code Online (Sandbox Code Playgroud)

我收到编译错误: Conditional downcast to CoreFoundation type 'SecIdentity' will always succeed

Mar*_*n R 8

SecIdentity\xe2\x80\x9 可以抽象表示身份的 Core Foundation 类型对象,\xe2\x80\x9d和 Core Foundation 类型的类型可以\n用 来检查CFGetTypeID()。所以你可以先检查类型ID。如果它与 an\n 的类型 ID 匹配,SecIdentity则强制转换是安全的:

\n\n
guard let cfIdentity = firstItem[kSecImportItemIdentity as String] as CFTypeRef?,\n    CFGetTypeID(cfIdentity) == SecIdentityGetTypeID() else {\n        throw AnError()\n}\nlet identity = cfIdentity as! SecIdentity\n
Run Code Online (Sandbox Code Playgroud)\n\n

另请参阅错误报告SR-7015 CoreFoundation 条件向下转型诊断并没有应有的帮助

\n\n
\n

应使用通知开发人员比较 CFTypeId 的消息来更新诊断(如果可能,使用修复程序)。

\n
\n