有没有一种方法可以使自定义协议像标准HashableEquatableCodable等一样传播,即当struct/class的所有属性都符合该协议时,struct/class本身就可以符合该协议.

假设我有这样一个简单的协议:

protocol State {
    init()
}

假设我有两个 struct :

struct State1: State {}
struct State2: State {}

他们符合协议,然后我想再有struct个符合我的协议,像这样:

struct AppState: State {  // error: Type 'AppState' does not conform to protocol 'State'
    let state1: State1
    let state2: State2
}

理论上,如果所有属性都有一个空init(),那么在AppState struct 中隐式实现init应该没有问题.但编译器只理解AppState中的显式init().那么,有没有一种方法可以增强我的State协议,使其具有该功能?

推荐答案

不幸的是,目前在Swift中,这并不是完全可能的.协议的自动一致性目前仅限于直接在编译器中实现(例如,参见implementation for CodableEquatable and Hashable);你能够连接到这个机制中的唯一方法是向编译器添加直接支持——如果你愿意Forking 编译器并使用它来编译所有代码,这是可行的,但这是一个相当大的飞跃.

Swift相关问答推荐

如何取消正在视图修改器中运行的任务

VisionOS发送通知

OBJC代码中Swift 演员的伊瓦尔:原子还是非原子?

在`NavigationStack`中使用`SafeAreaInset`修饰符时出现SwiftUI异常行为

是否在字符串属性上搜索数组和子数组?

在SwiftUI中判断选项时避免重复查看

将NavigationSplitView更改为NavigationStack

Swift图表';chartXVisibleDomain挂起或崩溃

关闭 SwiftUI TabView 中的子视图

为什么 UITapGestureRecognizer 对于 Swift 集合视图中的单元格图像无法正常工作?

本地对象的异步/等待引用捕获总是安全的还是理论上不安全?

将基于MyProtocol的泛型函数的参数更改为使用存在的any MyProtocol或some MyProtocol是否会受到惩罚?

来自数据的 SwiftUI 图像

无法增加系统镜像的大小

在 Swift 5.5 中编写同步和异步函数

SwiftUI 中的 .primary 和 .secondary colored颜色 是什么?

Swift:如何从函数返回类类型

Swift 中的 CommonHMAC

来自 ObservableObject 的绑定值

NSLocationWhenInUseUsageDescription 警告,但我已经添加了