Vorwort
Welcher der iOS-Entwickler hat nicht davon geträumt, an einem angesehenen Ort wie Yandex oder Avito zu arbeiten? Leider fragt nur hr bei Interviews nach Träumen, aber Entwicklerinterviewer stellen Fragen etwas anderer Art. Was ist der Unterschied zwischen Referenztyp und Werttyp oder Grenzen vom Frame? Fragen, die jeder von uns bei Interviews mehr als einmal gehört hat. Wenn Ihr Interview mit der Frage nach den Unterschieden zwischen dem signifikanten und dem Referenztyp beginnt oder im Sinne von „Erzählen Sie uns von SOLID“, sind Sie eindeutig auf dem Weg, eine Stelle bei So-so-Perspectives LLC zu finden.
In einer anständigen Gesellschaft werden Sie nicht nach einem solchen Unsinn gefragt. Machen Sie sich bereit für Fragen zu Versand, Beistelltisch und zugrunde liegender Warteschlange. Die Kenntnis solcher Nuancen wird in keiner Weise dazu beitragen, beim Scrollen 60 FPS zu erreichen, die mit Zellelementen beladen sind, und Sie nicht zu einem Ehrenentwickler Russlands machen. Sie werden dazu beitragen, in Ihnen eine Person zu erkennen, die nicht nur die xib-Konstante seit 4 Jahren geändert hat und sich jetzt als Senior iOS-Entwickler betrachtet, sondern sich wirklich für die Plattform interessiert. Es wird mir immer ein Rätsel bleiben, an welchem Punkt eine Person entscheidet, dass sie das Niveau von Mittel oder Senior erreicht hat. Nimmt wahrscheinlich an rein russischen Wettbewerben teil, bei denen ROS-GOS-iOS Kategorien und Titel für die Erfüllung von Standards und Preisen vergibt.
Zurück zu den Interviews. Der renommierte Arbeitgeber wird nicht nur knifflige Fragen zur Plattform stellen, sondern sicherlich auch zur Architektur. Warten Sie auf die Frage: „Warum haben Sie zuletzt VIPER anstelle von MVVM verwendet?“. Sie fragen sich vielleicht: „Was ist schlechtes MVC?“. Nun, der letzte Nagel im Deckel des Sarges werden Algorithmen sein. Selbst wenn Sie sich mit iOS und der Architektur mobiler Anwendungen bestens auskennen, aber die Schwächen von Arrays nicht kennen und die Suche nach einem Element nicht optimieren können, warten Sie nach dem Interview auf eine Antwort in der E-Mail:

Auf den Weiten des russischsprachigen Internets finden sich zahlreiche Artikel über Algorithmen und Datenstrukturen. Der einzige Nachteil, der die Studie verschleiern kann, ist der Mangel an Beispielen und Implementierungen für Swift. Es ist ziemlich schwierig, dieses Thema zu verstehen, wenn Sie viele dunkle Wörter und noch mehr obskure C ++ - Beispiele erhalten.
Für alle, die jeden Tag Smoothies in schicken Büros und bei Alumni-Meetings trinken möchten, um darüber zu sprechen, wie er allein die gesamte mobile Entwicklung von Sber in die Länge zieht, habe ich ein paar Artikel über Datenstrukturen vorbereitet. Artikel richten sich an Entwickler, die bereits mit Generika vertraut sind, mit Arrays / Sets / Wörterbüchern gearbeitet haben, die Unterschiede zwischen Klassen und Strukturen verstehen und so tun, als würden sie die Rekursion verstehen. Ich werde die Theorie nicht malen. Dies wurde bereits vor mir getan und ich bin sicher, dass es ziemlich informativ ist. Konzentrieren wir uns auf die Beispiele.
Verknüpfte Liste
Wikipedia wird bei der Theorie helfen
. Beginnen wir mit der Erstellung desselben
Knotens.
* Stellen Sie sicher, dass Sie Ihr Xcode-Farbschema auf dunkel ändern, da sonst keine Arbeit in Mail angezeigt wirdEin aufmerksamer Leser sollte fragen: „Warum hat der Momkin-Entwickler beschlossen, den Knoten als Klasse und nicht als Struktur zu implementieren? Der Artikel handelt von Datenstrukturen! “ Ich schlage vor, diese Entscheidung in den Kommentaren zu diskutieren. Fahren wir mit der am häufigsten verknüpften Liste fort. Die erste Implementierung sieht folgendermaßen aus:

Jeder Experte für
Selbstachtung wird feststellen, dass
WeakReference ein unbekannter Typ ist und zu Recht eine Implementierung erfordert.

Fügen Sie zu den Implementierungsmethoden hinzu, die für das Ausfüllen unserer Liste verantwortlich sind:


* Komplexität O (1) ist nur gültig, wenn die Struktur nicht kopiert werden muss. Andernfalls haben wir O (n) Komplexität. Dies gilt für alle Mutationsmethoden.Fügen Sie die Methoden hinzu, die für das Entfernen aus der Liste verantwortlich sind:


* @ discardableResult erspart uns das Schreiben von "_ =" vor dem Aufruf der Funktion, wenn der Rückgabewert für uns nicht interessant istUnser Handwerk sieht bereits aus wie eine funktionierende verknüpfte Liste. Versuchen wir es so schnell wie möglich zu machen. Dazu müssen wir nur zwei Dinge implementieren: das
BidirectionalCollection- Protokoll und die
Copy-on-Write- Technik. Beginnen wir mit dem Protokoll. Es gibt nur sehr wenige Methoden, und das Schwierigste ist, Index zu verstehen und zu implementieren.


Großartig! Jetzt stehen alle unsere Sammlungen unserer Liste zur Verfügung. Wir können Map, CompactMap, Filter, Includes usw. darauf anwenden. Copy-on-Write war an der Reihe. Wir implementieren die
copyIfNeeded () -Methode, deren Fehlen der Compiler jetzt andeutet, dass der Code nicht von D'Artagnan geschrieben wurde:

Diejenigen, die eine kluge Frage stellen oder auf Mängel hinweisen möchten, warten in den Kommentaren.
PS Ich danke
ivlevAstef für die Hilfe bei der Behebung der Fehler. Bisher hat noch niemand eine funktionierende Implementierung ohne schwache Wrapper vorgeschlagen.
Github-Code