Error是一种协议,一个人能够做到这一点……

let x: Result<Void, Error> = .success(())

ShadowError符合Error,也是一种协议,但人们无法做到这一点……

protocol ShadowError: Error {}
let x: Result<Void, ShadowError> = .success(()) // FAILS 类型""Any ShadowError""不符合Error

因为编译器会抱怨此错误

类型""Any ShadowError""不符合Error

结果失败类型是否为ShadowError(或其他protocol)?

推荐答案

作为一项协议,这是不可能的.您可以使ShadowError成为枚举或 struct (甚至是包装另一个错误的 struct ),但它不能是协议.协议存在项(协议的"任何"实例)不符合协议,因此any ShadowError不是错误.有一个神奇的例外:any Error确实符合Error.但你不能复制它.只有Error美元.

有关这方面的文档,请参阅SE-0235 Add Result to the Standard Library:

作为本提案准备工作的一部分,增加了对错误(且仅限于错误)的self 遵守.这对于处理一般上下文中的错误通常也很有用.

这种self 一致性不会扩展到包括错误协议在内的协议组合,而只会扩展到确切的类型错误.future 可能会添加这样的组合,但这不在SWIFT 5的范围内.

Swift相关问答推荐

Swift concurrency reload/await,支持只执行成功并重试

使用SWIFT宏从另一个枚举添加 case

仅使用@MainActor注释类的部分时的并发问题

出错-无法将季节类型的值转换为预期的参数类型';[水果]';

有条件地在同一视图上设置两个不同的过渡

是否可以限制 ExpressibleByIntegerLiteral struct 的初始值?

(Swift)混淆了函数内 for-in 循环的返回值和循环后(函数内)的返回值)

macOS 的窗口框架中使用的真实类型和真实类型是什么?

从 iPhone 中的安全飞地获取真正的随机数?

如何延迟 swift 属性 didSet 使其每秒只触发一次

String(validatingUTF8:) 和 String(utf8String:) 之间有区别吗?

如何在 ZStack 中单独下移卡片?

故事板未在助手中显示视图控制器

如何从 LLDB 调用带有断点的 Swift 函数?

我将哪种 Swift 数据类型用于货币

FirebaseStorage:如何删除目录

UITableViewAlertForLayoutOutsideViewHierarchy 错误:仅警告一次(iOS 13 GM)

<<错误类型>> 奇怪的错误

swift 中的@property/@synthesize 类似功能

Swift - 要求实现协议的类是某个类的子类