Wie die anderen Antworten haben entzog sich an, Sie nicht Meta-Typen mit is
verwenden können. Eine bessere Lösung wäre jedoch, einfach Generika zu verwenden. Dies ermöglicht Swift den Typ, den Sie in die Funktion übergeben zu schließen, so dass Sie es schreiben, wie:
protocol Base : class {
var value: Int { get set }
}
class ObjectTypeA: Base {
var value: Int = 0
}
class ObjectTypeB: Base {
var value: Int = 1
}
var objects: [Base] = [ObjectTypeA(), ObjectTypeB()]
func updateElements<T:Base>(ofType type: T.Type, withValue value: Int) {
objects.filter{ $0 is T }.forEach{ $0.value = value }
}
updateElements(ofType: ObjectTypeB.self, withValue: 10)
Sie auch zu ermöglichen Swift wollen werden Ihre Base
Protokollklasse gebunden (: class
) machen, um zu behandeln Base
typisierte Instanzen als Referenztypen (damit Sie $0.value = value
tun können).
Ihre vorherigen Code:
var object = $0
object.value = value
würde für Referenztypen gearbeitet haben, aber nicht für Werttypen - wie object
hier ist einfach eine Kopie von $0
, so werden alle Mutationen nicht in widerspiegeln das Array. Daher sollten Sie Ihr Protokoll mit Anmerkungen versehen, um zu verdeutlichen, dass Ihr Protokoll nicht für die Verwendung mit Werttypen ausgelegt ist.
Wenn Sie wollen in der Lage sein, Werttypen zu handhaben, sollten Sie mit map
stattdessen berücksichtigen:
func updateElements<T:Base>(ofType type: T.Type, withValue value: Int) {
objects = objects.map {
var object = $0
if object is T {
object.value = value
}
return object
}
}
Mögliche Duplikat von [Wie zwei Instanzen der gleichen Klasse/Typ in swift sind zu überprüfen] (http://stackoverflow.com/questions/24161622/how-to-check-two-instances-are-the-same-class-type-in-swift) – Daniel
Wie schon erwähnt - "Das ist eigentlich kein reiner Swift "Ich würde gerne eine richtige Koschere finden, um dieses Beispiel zu lösen. – adnako
@simpleBob, Könnten Sie bitte, bitte, meinen Code reparieren, um mir zu zeigen, was meinst du - "bereits beantwortet"? Ich kann dort keine Antwort finden. – adnako