Swift 我将如何使用一个类型参数符合协议的泛型数组?

Swift 我将如何使用一个类型参数符合协议的泛型数组?,swift,generics,protocols,Swift,Generics,Protocols,有没有一种方法可以使泛型数组(或任何泛型类型)的类型参数符合协议 协议MyProtocol{} 结构MyStruct{ 让我的道具:T } //无法推断泛型参数“T” //显式指定泛型参数以解决此问题 设array1=[MyStruct]() //协议类型“MyProtocol”的值不能与“MyProtocol”一致; //只有结构/枚举/类类型才能符合协议 设array2=[MyStruct]() //类型“Any”不符合协议“MyProtocol” 让array3=[MyStruct,但该解

有没有一种方法可以使泛型数组(或任何泛型类型)的类型参数符合协议

协议MyProtocol{}
结构MyStruct{
让我的道具:T
}
//无法推断泛型参数“T”
//显式指定泛型参数以解决此问题
设array1=[MyStruct]()
//协议类型“MyProtocol”的值不能与“MyProtocol”一致;
//只有结构/枚举/类类型才能符合协议
设array2=[MyStruct]()
//类型“Any”不符合协议“MyProtocol”
让array3=[MyStruct,但该解决方案在我的情况下不起作用,因为数组中的项是
MyStruct
,具有符合
MyProtocol
的任何类型


我也读过和其他类似的问题,但解决方案也不合适。

若要了解您的场景有什么问题,请忘记尝试声明此数组的类型,并尝试实际使用实际对象创建这样的数组:

protocol MyProtocol {}
struct MyStruct<T: MyProtocol> {
  let myProp: T
}
struct S1 : MyProtocol {}
struct S2 : MyProtocol {}
let myStruct1 = MyStruct(myProp: S1())
let myStruct2 = MyStruct(myProp: S2())
let array = [myStruct1, myStruct2] // error

我们得到了相同的编译错误。同样,你可能会想象你可以把
cat
kitten
放在一个数组中,因为kitten是cat的一个子类。但事实并非如此。
Animal
Animal
是不相关的类型。

我认为你需要一个数组,每个MyStruct的具体实现,
array:[MyStruct]
where
struct MyType:MyProtocol{}
问题在于协议不是类型。表达式
MyStruct
意味着采用协议的真实类型T。因此,在引擎盖下,您将有一个类型MyStruct-where-T-is-a和另一个类型MyStruct-where-T-is-B。这些是不相关的类型。您无法创建这些内容的数组,因为它们没有共同点。这可能只是上的另一个变体,也许我误解了你的问题,但是
MyStruct
真的需要泛型吗?如果你想要像
let array2=[MyStruct]()
,这可能意味着你不想在
MyStruct
中使用泛型
protocol MyProtocol {}
struct MyStruct<T: MyProtocol> {
  let myProp: T
}
struct S1 : MyProtocol {}
struct S2 : MyProtocol {}
let myStruct1 = MyStruct(myProp: S1())
let myStruct2 = MyStruct(myProp: S2())
let array = [myStruct1, myStruct2] // error
class Cat {}
class Kitten: Cat {}
struct Animal<T: Cat> {}
let cat = Animal<Cat>()
let kitten = Animal<Kitten>()
let array2 = [cat, kitten] // error