So erstellen Sie Brücken zwischen Frameworks in einer iOS-App

Wenn der Code Ihrer App so aussieht…

"Ich möchte diesen Teil meiner App exportieren, aber er ist wie ein Spaghetti-Teller mit dem Rest der App verbunden!"

Es wurde versucht, einen kleinen Teil der App zu exportieren, der zu abhängig ist

Als ich anfing, einen Teil der App, an der ich arbeitete, zu modularisieren, stieß ich gegen eine Wand.

Ich wollte einen Service (eigentlich den Tracking-Service) in ein separates Framework exportieren. Das Problem war, dass dieser Service zu wenig an die App gebunden war. Es wurde ein anderer Dienst verwendet, der selbst einen anderen tief in der App verankerten Dienst verwendete.

Um den Tracking-Service zu exportieren, hätte ich den gesamten Service im neuen Framework umgestalten und neu gestalten müssen!

Tatsache ist jedoch, dass ich nicht die Zeit hatte, dies zu tun, und Regressionstests wären ein Albtraum gewesen und aus vielen anderen Gründen, die Sie in jedem Unternehmen haben könnten (Prozess, Budget, Frist).
Also musste ich herausfinden, wie ich diesen Teil meiner App exportieren kann, ohne alles neu zu gestalten.

Beginnen wir mit einem konkreten Beispiel!

Hier ist der beste Weg, um zu lernen und zu verstehen, wie Dinge funktionieren, das Üben! (Ich werde das Github-Repo für dieses Beispiel am Ende dieses Beitrags bereitstellen.)
Lassen Sie mich den Kontext festlegen, wir haben eine kleine App mit nur 2 Bildschirmen:

  • Ein Startbildschirm
  • Ein Zahlungsbildschirm (wir möchten diesen Bildschirm in ein Framework exportieren)

Die Zahlungsseite enthält ein Textfeld zur Eingabe einer Kartennummer und eine Schaltfläche zum Bezahlen. Wenn Sie die Taste drücken, sollte die Zahlung gestartet werden.
Aber ! Die Herausforderung liegt in der Zahlungsmethode. Nehmen wir an, wir können den Zahlungsservice aus Gründen, die ich bereits erwähnt habe, einfach nicht exportieren.

Startbildschirm und Zahlungsbildschirm

Wir haben also diese beiden Bildschirme, die in zwei verschiedenen Zielen deklariert sind. Der Startbildschirm wird im Hauptziel der App deklariert, und der Zahlungsbildschirm wird in einem anderen Modul namens PaymentModule deklariert. Wir haben auch einen PaymentService im Hauptziel der App wie folgt deklariert:

Die Bezahlmethode kann nicht aus der App extrahiert werden, da sie zu abhängig ist. Wir wollen es aber aus dem Zahlungsmodul heraus nutzen.

Wir haben einen PaymentViewController im Zahlungsmodul definiert. Wenn wir versuchen, PaymentService aufzurufen, wird ein Fehler angezeigt, da dieser Dienst nicht im Modul enthalten ist. Sie können das Hauptziel nicht in ein Modul importieren (das wäre ein Unsinn)

Wie verwenden wir diese Methode vom PaymentViewController aus?

Definieren Sie ein Protokoll im Modul

Dies wird unsere Brücke sein. Sie müssen im Modul ein Protokoll mit einer Methode definieren, die beschreibt, was Sie im Hauptziel der App verwenden möchten.

Definieren wir also ein Protokoll namens PaymentServiceProtocol mit einer Methode pay:

Implementierung des Protokolls in der App

Jetzt müssen wir unserem PaymentService mitteilen, dass er dieses Protokoll einhält. Wir müssen nur Folgendes hinzufügen:

"Warum ist die im Protokoll deklarierte Methode in dieser Erweiterung nicht implementiert?"

Sie haben Recht, wenn Sie ein Protokoll einhalten, müssen Sie dessen Eigenschaften und Methoden implementieren. Der Trick dabei ist, dass der Methodenname im Protokoll genau mit dem Methodennamen im PaymentService übereinstimmt, den wir etwas früher deklariert haben. Auf diese Weise weiß das System, dass es beim Zugriff auf die Protokollmethode die in der PaymentService-Klasse deklarierte Methode pay verwenden muss.

Die beiden Teile verbinden

Wir müssen jetzt die beiden Teile zusammenfügen.
Wenn wir auf dem HomeViewController auf die Schaltfläche "Zur Zahlungsseite" tippen, wird ein PaymentViewController instanziiert. Zu diesem Zeitpunkt übergeben wir einen Verweis auf die PaymentService-Klasse, der Payment-Controller im Modul sieht ihn jedoch als PaymentServiceProtocol-Typ.

Hier ist der Trick:

Wir übergeben PaymentService.self und der Code im Modul sieht einen PaymentServiceProtocol.Type.
Jetzt können wir die in der App definierte Bezahlmethode aus dem Modul aufrufen!

Die Brücke benutzen

Es ist jetzt sehr einfach, die von uns erstellte Brücke zu verwenden:

Die Methode didTapPayButton wird aufgerufen, wenn Sie auf die Schaltfläche Zahlen tippen (klingt richtig, oder?). Überprüfen Sie in Zeile 23: Wir rufen die Bezahlmethode auf der Protokollreferenz auf, die wir von der App erhalten haben.

Da der PaymentService diesem Protokoll entspricht, führt das System den Code innerhalb der in PaymentService.swift definierten Methode pay aus.

Mit anderen Worten, wir verwenden die Methode, die wir am Anfang nicht aus dem Modul aufrufen konnten! Die Brücke ist jetzt gesetzt.

So sieht es aus, wenn Sie auf die Schaltfläche zum Bezahlen tippen.

Verwenden der im Hauptziel enthaltenen Zahlungsmethode aus dem Zahlungsmodul

Fazit

Abschließend kann diese Überbrückungsmethode verwendet werden, wenn Sie eine Komponente Ihrer App in ein Framework exportieren möchten.

Mit dieser Technik können Sie die Nudel aus der Schüssel herausschneiden, wenn Sie gezwungen sind, diesen Teil Ihrer App in ein Framework zu exportieren, aber Sie können aus irgendeinem Grund nicht das Ganze exportieren.

Ich halte dies für eine vorübergehende Lösung, bevor Sie die gesamte Komponente in das Framework integrieren, wenn Sie beispielsweise Zeit haben. (In diesem Szenario müssen Sie eines Tages die Zahlungsmethode im Zahlungsmodul exportieren.)

Ich gebe zu, dass wir in einer idealen Welt mit Einhörnern und schickem Zeug so etwas nicht machen würden. Wir würden lieber die gesamte Komponente exportieren, aber wie ich schon oft sagte, ist dies nicht immer möglich.

Das Github-Repo dieses Projekts finden Sie hier. Zögern Sie nicht, die Funktionsweise der Brücke zu überprüfen und selbst auszuprobieren.
Ich hoffe, dieser Beitrag kann helfen, zögern Sie nicht, Fragen zu stellen, die Sie im Sinn haben!

Diese Geschichte wurde in The Startup, der größten Veröffentlichung von The Medium zu Unternehmertum, veröffentlicht, gefolgt von +442.678 Personen.

Abonnieren Sie hier unsere Top Stories.