在我的特定情况下,我想要这样的东西:
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] = []