我认为您的主要目的是保存符合某些协议的对象的集合,将其添加到该集合中并从中删除。这是客户端“ SomeClass”中所述的功能。平等继承需要自我,而此功能不需要。我们可以使用“索引”函数在Obj-C的数组中完成这项工作,该函数可以使用自定义比较器,但是Swift不支持此功能。因此,最简单的解决方案是使用字典而不是数组,如下面的代码所示。我提供了getElements(),它将为您提供所需的协议数组。因此,使用SomeClass的任何人甚至都不知道使用字典来实现。
因为无论如何,您都需要一些区别属性来分隔您的objets,所以我假设它是“名称”。创建新的SomeProtocol实例时,请确保您的do element.name =“ foo”。如果未设置名称,则仍然可以创建实例,但是不会将其添加到集合中,并且addElement()将返回“ false”。
protocol SomeProtocol {
var name:String? {get set} // Since elements need to distinguished,
//we will assume it is by name in this example.
func bla()
}
class SomeClass {
//var protocols = [SomeProtocol]() //find is not supported in 2.0, indexOf if
// There is an Obj-C function index, that find element using custom comparator such as the one below, not available in Swift
/*
static func compareProtocols(one:SomeProtocol, toTheOther:SomeProtocol)->Bool {
if (one.name == nil) {return false}
if(toTheOther.name == nil) {return false}
if(one.name == toTheOther.name!) {return true}
return false
}
*/
//The best choice here is to use dictionary
var protocols = [String:SomeProtocol]()
func addElement(element: SomeProtocol) -> Bool {
//self.protocols.append(element)
if let index = element.name {
protocols[index] = element
return true
}
return false
}
func removeElement(element: SomeProtocol) {
//if let index = find(self.protocols, element) { // find not suported in Swift 2.0
if let index = element.name {
protocols.removeValueForKey(index)
}
}
func getElements() -> [SomeProtocol] {
return Array(protocols.values)
}
}