Schnelle Erweiterung einer Klasse NUR, wenn sie einem bestimmten Protokoll entspricht

8

Hi there =) Ich war gerade mit einem Designproblem konfrontiert, bei dem ich (im Wesentlichen) Folgendes tun muss:

Ich möchte ein bisschen Code in viewWillAppear: von jeder UIViewController Unterklasse einfügen, die einem Protokoll MyProtocol entspricht. Im Code erklärt:

%Vor%

Das Hauptproblem hier ist, dass ich zwei Dinge in der Erweiterung UIVIewController machen muss:

  1. Rufen Sie MyProtocol und UIViewController APIs
  2. auf
  3. Überschreibe UIViewController methode initialize() , um in der Lage zu sein, viewWillAppear: zu swizzlen

Diese beiden Funktionen scheinen inkompatibel zu sein (ab Swift 3), weil:

  1. Wir können Klassen nicht mit Bedingungen erweitern (d. h. extension UIViewController where Self: MyProtocol )
  2. Wenn wir stattdessen das Protokoll erweitern , können wir die Bedingungen extension MyProtocol where Self: UIViewController hinzufügen, aber wir können KEINE Methoden einer Klasse in einer Protokollerweiterung überschreiben , was bedeutet, dass wir t public override class func initialize() , das für das Swizzling benötigt wird.

Ich habe mich also gefragt, ob da draußen jemand ist, der eine schnelle Lösung für dieses Problem anbieten kann? =)

Vielen Dank im Voraus !!

    
Robertibiris 17.11.2016, 12:44
quelle

2 Antworten

1

Nun, bis jetzt habe ich keine wirklich befriedigende Art gefunden, dies zu tun, aber ich habe mich entschieden zu posten, was ich für dieses spezielle Problem getan habe. Kurz gesagt, die Lösung geht so (mit dem ursprünglichen Beispielcode):

%Vor%

Nachteile:

  • Nicht "der schnelle Weg" Dinge zu tun
  • Die Swizzling-Methode wird aufgerufen und wirkt sich auf ALL UIViewControllers aus, auch wenn wir nur diejenigen validieren, die dem Protokoll MyProtocol entsprechen, um die sensiblen Codezeilen auszuführen.

Ich hoffe sehr, dass es jedem anderen hilft, der sich in einer ähnlichen Situation befindet =)

    
Robertibiris 23.11.2016, 08:04
quelle
7

Sie waren in der Nähe der Lösung. Ich muss es einfach anders herum machen. Erweitern Sie das Protokoll nur, wenn es Teil von UIViewController ist.

%Vor%     
Klemen Zagar 14.04.2017 19:48
quelle