我想通过选择不同的枚举大小写来约束Swift中的泛型类型。
下面是一个代码示例:
enum Test {
case T1
case T2
}
enum T1 {
case one
case two
}
enum T2 {
case three
case four
}
indirect enum Foo<T> {
case empty
case cons(T, Foo<T>)
}
let x: Foo<T1> = .cons(.one, .empty)
我有一个第一个Enum,其中包含T1和T2的两种情况。
我试图限制Foo Enum中的T类型以具有可用类型的集合,在我的示例中为T1和T2。
当我声明x
时,允许的类型为Test中包含的T1
或T2
,而不是其他类型。
因此,仅允许使用枚举Test
中的类型。
我的问题:是否可以使用我的Enum约束泛型类型?如果是,怎么办? 否则,我该怎么办?
答案 0 :(得分:1)
根据评论,我认为这是您要实现的目标:
protocol MyEnums {}
enum T1: MyEnums { case one, two }
enum T2: MyEnums { case one, two }
enum T3 { case one, two }
let foo: [MyEnums] = [T1.one, T1.two, T2.one, T2.two]
该数组只能包含符合MyEnums
协议的对象。
请注意,枚举T3
不能存储在foo
中,因为它不符合协议MyEnums
。
还有一点。实际上,您可以执行您所要求的操作:
protocol MyEnums {}
enum T1: MyEnums { case one, two }
enum T2: MyEnums { case one, two }
enum T3 { case one, two }
indirect enum Foo<T: MyEnums> {
case empty
case cons(T, Foo<T>)
}
请注意,泛型为<T: MyEnums>
。
该代码将完全满足您的要求。它可以存储符合MyEnums
协议的枚举。因此,如果它们符合MyEnums
,则可以存储枚举T1和T2,但不能存储T3,因为它们不符合。
因此您将能够执行此操作:
let x: Foo = .cons(T1.one, .cons(T1.two, .empty))
但是第二种方法不允许这样做:
let x: Foo = .cons(T1.one, .cons(T2.one, .empty))
我会尝试看看我们是否可以做到这一点。
我明白了!!这正是您要的:
protocol MyEnums {}
protocol MyEnums1: MyEnums {}
enum T1: MyEnums1 { case one, two }
enum T2: MyEnums1 { case one, two }
enum T3 { case one, two }
indirect enum Foo<T: MyEnums> {
case empty
case cons(MyEnums1, Foo<T>)
}
let x: Foo<T1> = .cons(T1.one, .cons(T2.one, .empty))
print(x)
它需要2个协议,但我最终修复了方法2。请记住,您只能放入符合MyEnums1
的对象,因此T3
不是一个选择。完美!
这是一个很酷的问题。