Swift中不同类型向CustomDebugStringConvertible的转换规则疑问
关于CustomDebugStringConvertible向上转换的编译问题解析
核心规则
Swift标准库的自动实现逻辑:
- 仅为遵循
Error协议的值类型(结构体、枚举)自动合成CustomDebugStringConvertible的默认实现; - 类类型(无论是否遵循
Error)不会自动获得该协议的默认实现; - 不遵循
Error的值类型,也不会自动获得该协议的默认实现。
逐个案例分析
1. ErrorStruct(编译成功)
ErrorStruct是遵循Error的结构体(值类型),标准库自动为它生成了CustomDebugStringConvertible的实现,因此可以成功向上转换。
2. ErrorClass(编译失败)
ErrorClass是遵循Error的类(引用类型),标准库不会为类自动合成CustomDebugStringConvertible的实现,且代码中未手动实现该协议,因此无法完成向上转换,编译报错。
3. MyEnum(编译失败)
MyEnum是枚举(值类型)但未遵循Error协议,标准库不会为它自动合成CustomDebugStringConvertible的实现,也没有手动实现,所以转换失败。
4. ErrorEnum(编译成功)
ErrorEnum是遵循Error的枚举(值类型),标准库自动合成了CustomDebugStringConvertible的实现,因此可以正常转换。
解决方法
如果要让ErrorClass或MyEnum支持转换,需要手动实现CustomDebugStringConvertible协议:
// 为ErrorClass添加协议实现 class ErrorClass: Error, CustomDebugStringConvertible { var debugDescription: String { return "ErrorClass 实例" } } // 为MyEnum添加协议实现 enum MyEnum: CustomDebugStringConvertible { case hello case world var debugDescription: String { switch self { case .hello: return "hello" case .world: return "world" } } }
内容的提问来源于stack exchange,提问作者wlnirvana
相关产品推荐
相关产品推荐

