通过快速枚举约束通用类型

时间:2020-07-10 14:00:22

标签: swift generics enums

我想通过选择不同的枚举大小写来约束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中包含的T1T2,而不是其他类型。 因此,仅允许使用枚举Test中的类型。

我的问题:是否可以使用我的Enum约束泛型类型?如果是,怎么办? 否则,我该怎么办?

1 个答案:

答案 0 :(得分:1)

方法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


方法2

还有一点。实际上,您可以执行您所要求的操作:

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))

我会尝试看看我们是否可以做到这一点。


方法3

我明白了!!这正是您要的:

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不是一个选择。完美!

这是一个很酷的问题。

相关问题