2017-05-16 4 views
0

würde Ich mag AnyClass (AKA AnyObject.Type) entsprechen Equatable so machen, dass, wenn ich ein Array mit AnyClass Elementen (Array<AnyClass>), ich remove(Element:) nennen kann, aber dies erfordert Element zu Equatable anzupassen.Swift arbeiten, um `AnyObject.Type` mit` Equatable` konform zu machen?

+0

http://stackoverflow.com/questions/24938948/array-extension-to-remove-object-by-value anzeigen (es kann eigentlich ein Duplikat sein). – rmaddy

+0

@rmaddy Nein, dies ist eine Frage, die spezifisch dafür ist, dass Erweiterungen des Compilers 'AnyClass' nicht zulassen, was es' AnyClass' unmöglich macht, sich an "Equatable" anzupassen, wie in dem von Ihnen angegebenen Thread –

+0

verwendet Bevor Sie weitere Anstrengungen unternehmen, um dies zu erreichen, überlegen Sie, ob Sie einen gemeinsamen Nenner der betroffenen Klassen finden können, zum Beispiel ein Protokoll. Diese Art von * AnyClass/AnyObject gefälschten Generika * ist schlimmer als die Suche nach einem gemeinsamen Nenner. – vadian

Antwort

0

Ich denke nicht wirklich, was Sie versuchen zu erreichen, ist möglich, oder ob Sie sogar versuchen sollten, es auf diese Weise zu tun.

Klassen sind in der Regel reale Objekte, ob dies ein Auto, eine Ansicht oder etwas ganz anderes ist. Es ist also sehr schwierig zu sagen, ob es eine benutzerdefinierte Klasse ist, die ich selbst erstellt habe, genauso wie diese andere benutzerdefinierte Klasse, die ich erstellt habe.

Swift weiß einfach nicht, wie man sie vergleicht, was sie gleich macht.

Der einfachste Weg, um das zu erreichen, was Sie wollen, wäre ein benutzerdefiniertes Protokoll/Interface zu definieren, das die generische Version der Klassen repräsentiert, die Sie in dieser Anwendung verwenden werden und dann sicherstellen, dass jede davon konform und auch gleich ist. Dann sollten Sie in der Lage sein, etwas zu tun:

var objs = Array<MyAppClassesProtocol>() 

und auch remove(element:)

1

Seit Swift 3 verwenden Sie AnyHashable als Ersatz für AnyObject nutzen könnten. Es stellt jeden Wert dar, der dem Protokoll Equatable entspricht.

Statt

var array:[AnyObject] = [] 

schreiben gerade

var array:[AnyHashable] = [] 
Verwandte Themen