Ich gehe davon aus, dass Ihr Hauptziel darin besteht, eine Sammlung von Objekten zu halten, die einem Protokoll entsprechen, diese Sammlung zu ergänzen und daraus zu löschen. Dies ist die in Ihrem Client angegebene Funktion "SomeClass". Gleichwertige Vererbung erfordert Selbst und das wird für diese Funktionalität nicht benötigt. Wir hätten diese Funktion in Arrays in Obj-C mithilfe der "Index" -Funktion ausführen können, die einen benutzerdefinierten Komparator verwenden kann, dies wird jedoch in Swift nicht unterstützt. Die einfachste Lösung besteht also darin, ein Wörterbuch anstelle eines Arrays zu verwenden, wie im folgenden Code gezeigt. Ich habe getElements () bereitgestellt, mit dem Sie das gewünschte Protokollarray zurückgeben können. Jeder, der SomeClass verwendet, würde also nicht einmal wissen, dass ein Wörterbuch für die Implementierung verwendet wurde.
Da Sie in jedem Fall eine unterscheidende Eigenschaft benötigen würden, um Ihre Objekte zu trennen, habe ich angenommen, dass es sich um "Name" handelt. Stellen Sie sicher, dass do element.name = "foo" ist, wenn Sie eine neue SomeProtocol-Instanz erstellen. Wenn der Name nicht festgelegt ist, können Sie die Instanz weiterhin erstellen, sie wird jedoch nicht zur Auflistung hinzugefügt, und addElement () gibt "false" zurück.
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)
}
}