Swift中有什么方法可以定义一个包含不同数据类型元素的集合吗



在我的特定情况下,我想要这样的东西:

var collectionWithDifferentTypes: [ObservableObject] = []
var elementOfTypeAWhichConformsToObservableObject = TypeA()
var elementOfTypeBWhichConformsToObservableObject = TypeB()
collectionWithDifferentTypes.append(elementOfTypeAWhichConformsToObservableObject)
collectionWithDifferentTypes.append(elementOfTypeBWhichConformsToObservableObject)

但是让数组符合ObservableObject是不可能的。根据文档的状态,数组、集合和字典只能包含相同类型的元素。swift有没有办法拥有一个类似于我上面描述的系列?

出现此错误的原因是ObservableObject指定了一个关联类型ObjectWillChangePublisher,该类型必须在符合协议的类中定义。Swift有一个令人讨厌的特点,即任何指定关联类型的协议都不能用作泛型参数,因为运行时需要知道如何定义关联类型才能有效地使用它

为了将这样的协议用作泛型类型,您必须执行错误消息指定的操作,并将其用作泛型约束。这意味着,无论您在哪里定义数组,都必须使用ObservableObject作为约束,使其成为通用上下文。

(类别字段(

class SomeClass<T: ObservableObject> {
var myArray: [T] = []
}

(函数变量(

func doAThing<T: ObservableObject>() {
var myArray: [T] = []
}

(有关此错误的含义,请参阅本文以获得更深入的解释。(

当然,总有一种核选项,就是将数组定义为[Any]

我能想到两种方法。如果你用TypeA对TypeB进行子类化,那么你可以使用var collectionWithDifferentTypes: [TypeA] = [],或者如果它们都符合相同的协议。不需要子类化。只需使用var collectionWithDifferentTypes: [protocolName] = []

相关内容

最新更新