You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift 4中能否将遵循协议的枚举类型存入集合?

解决Swift中存储遵循协议的枚举类型到数组的问题

我完全懂你的需求——想用枚举来管理这些测试类型,把它们的类型本身放进数组里实现通用逻辑,而不是切换到类的方案。你原来的代码报错是因为数组的类型声明写错了,咱们来一步步修正:

首先,你需要把数组的类型从[TestEnumProtocol.self]改成[TestEnumProtocol.Type],后者才表示“所有遵循TestEnumProtocol协议的类型的元类型集合”。修正后的完整代码如下:

protocol TestEnumProtocol {
    static var name: String { get }
    static var count: Int { get }
}

enum Test1 : TestEnumProtocol {
    static var name: String { return "Test1" }
    static var count: Int { return 2 }
    case A, B
}

enum Test2 : TestEnumProtocol {
    static var name: String { return "Test2" }
    static var count: Int { return 3 }
    case AA, BB, CC
}

// 修正后的数组声明,现在可以正常编译了
var enums: [TestEnumProtocol.Type] = [Test1.self, Test2.self]

接下来你就可以像处理普通数组一样遍历它,访问协议要求的静态属性,实现你的通用多变量测试逻辑:

// 遍历数组,统一处理每个枚举类型的信息
for enumType in enums {
    print("枚举类型名称:\(enumType.name),成员数量:\(enumType.count)")
}

为什么原来的写法会报错?

TestEnumProtocol.self是协议本身的元类型实例,而我们需要的是“遵循这个协议的具体类型的元类型”,所以必须用TestEnumProtocol.Type来作为数组的元素类型——这个类型相当于一个约束,确保数组里只能存放符合TestEnumProtocol的类型(你的场景里都是枚举,完美适配)。

这样既保留了你想要的枚举直观性,又能实现通用的多类型处理逻辑,完全不需要切换到类的方案~

内容的提问来源于stack exchange,提问作者taichino

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:58:47