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
相关产品推荐
相关产品推荐

