Я полагаю, что ваша основная цель - хранить коллекцию объектов, соответствующую какому-либо протоколу, добавлять в эту коллекцию и удалять из нее. Это функциональность, как указано в вашем клиенте "SomeClass". Равное наследование требует себя, и это не нужно для этой функциональности. Мы могли бы выполнить эту работу в массивах в Obj-C, используя функцию «index», которая может принимать пользовательский компаратор, но это не поддерживается в Swift. Поэтому самое простое решение - использовать словарь вместо массива, как показано в коде ниже. Я предоставил getElements (), который вернет вам требуемый массив протоколов. Поэтому любой, кто использует SomeClass, даже не знает, что для реализации использовался словарь.
Поскольку в любом случае вам понадобится какое-то отличительное свойство для разделения ваших объектов, я предположил, что это «имя». Пожалуйста, убедитесь, что ваш do element.name = "foo" при создании нового экземпляра SomeProtocol. Если имя не задано, вы все равно можете создать экземпляр, но он не будет добавлен в коллекцию, а 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)
}
}