Я вважаю, що ваша основна мета - зберегти колекцію об'єктів, що відповідають деякому протоколу, додати до цієї колекції та видалити з неї. Це функціональність, зазначена у вашому клієнті "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)
}
}