通过swift枚举约束泛型类型

通过swift枚举约束泛型类型,swift,generics,enums,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> = .con

我希望通过选择不同的枚举案例来约束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
}
枚举T1{
案例一
案例二
}
枚举T2{
案例三
案例四
}
间接枚举Foo{
空箱
案例cons(T、Foo)
}
设x:Foo=.cons(.one,.empty)
我有一个第一个枚举,它包含两个T1和T2的案例。 我试图约束Foo Enum中的类型T,使其具有可用的类型集合,在我的示例中是T1和T2。 当我声明
x
时,允许的类型是
T1
T2
包含在测试中,而不是其他类型。 因此,必须只允许Enum
Test
中的类型

我的问题:是否可以使用我的枚举来约束泛型类型?如果是,如何进行? 否则,我该怎么办?

方法1 根据评论,我认为这就是你想要实现的目标:

协议MyEnums{}
枚举T1:MyEnums{case one,two}
枚举T2:MyEnums{case one,two}
枚举T3{案例一,案例二}
让foo:[MyEnums]=[T1.1,T1.2,T2.1,T2.2]
数组只能包含符合
MyEnums
协议的对象。
请注意enum
T3
如何不能存储在
foo
中,因为它不符合协议
MyEnums


方法2 还有一点。实际上,你可以按照你的要求去做:

协议MyEnums{}
枚举T1:MyEnums{case one,two}
枚举T2:MyEnums{case one,two}
枚举T3{案例一,案例二}
间接枚举Foo{
空箱
案例cons(T、Foo)
}
请注意,泛型是

这段代码将完全满足您的要求。它可以存储符合
MyEnums
协议的枚举。因此,如果枚举T1和T2符合
MyEnums
,则可以存储它们,但不能存储T3,因为它不是

因此,您将能够做到这一点:

设x:Foo=.cons(T1.one.cons(T1.two.empty))
但是,第二种方法不允许:

设x:Foo=.cons(T1.one,.cons(T2.one,.empty))
我会试着看看我们是否能做到这一点


方法3 我明白了!!这正是你想要的:

协议MyEnums{}
协议MyEnums1:MyEnums{}
枚举T1:MyEnums1{案例一,案例二}
枚举T2:MyEnums1{case one,two}
枚举T3{案例一,案例二}
间接枚举Foo{
空箱
案件被告(MyEnums1,Foo)
}
设x:Foo=.cons(T1.1,.cons(T2.1,.empty))
打印(x)
它需要2个协议,但我最终修复了方法2。请记住,您只能放入符合
MyEnums1
的对象,因此
T3
不是一个选项。太好了


这是一个很酷的问题。

重申一下我认为你的问题。。。是否可能有一个泛型类型可以是a、B或C类型,但不能是其他类型。答案是否定的。你可以约束到一个协议或类,或者基于协议的相关类型。谢谢你的回答,你理解了我的问题。我能用协议做这种事吗?你说的“这种事”是什么意思?如果你的意思是,你能约束到一个协议,那么是的-这正是我在评论中所说的。也许我误解了你的要求…对不起,我必须更准确。我想知道我是否可以用协议约束我想要的方式(T1和T2)。假设我可以约束10种不同的类型,我该怎么做?谢谢你的回答!那正是我想要的!