Swift中<type implement =“”protocol =“”>的集合

时间:2016-08-25 20:39:07

标签: swift generics swift-protocols

考虑这个(简化的)程序。我有一个协议Thing以两个结构ThingOneThingTwo实现。我有一个类ThingCollection,我想存储实现Thing协议的任意结构实例,这意味着ThingOne()可以替换为ThingTwo()。我有一个类ThingCollectionCollection,我希望存储ThingCollection的任意实例,而不管它包含Thing个实例:

protocol Thing: Equatable {

}

struct ThingOne: Thing {
    public static func ==(lhs: ThingOne, rhs: ThingOne) -> Bool {
        return true
    }
}

struct ThingTwo: Thing {
    public static func ==(lhs: ThingTwo, rhs: ThingTwo) -> Bool {
        return true
    }
}

class ThingCollection {
    public var things: [Thing] = [ThingOne()] // Error here
}

class ThingCollectionCollection {
    var thingCollections: [ThingCollection] = [ThingCollection()]
}

在Swift Playground中,我在public var things: [Thing]陈述

时收到错误消息
  

协议'Thing'只能用作通用约束,因为它具有Self或相关类型要求。

如果协议Thing没有继承其他协议,则此代码有效,但在我的情况下,我确实希望Thing的实现是Equatable(并且可能是Hashable)。

我想我可以使ThingCollection泛型并使用不同的实例来存储单一类型的Thing,但是我怎样才能在{{1}中存储任意ThingCollection个实例}}?我可以使用ThingCollectionCollection只能保留一种ThingCollection的实例。

0 个答案:

没有答案