2016-07-19 27 views
1

Ich brauche Ratschläge, wie ich am besten vorgehen sollte.Ist es möglich, eine optionale und nicht optionale Version eines schnellen Protokolls dynamisch zu erstellen?

Ich habe viele Daten von einem Server, den ich analysieren muss in Strukturen konvertieren. Also lassen Sie uns sagen, ich bin immer seller Informationen von einem Server, kann die Struktur wie folgt aussehen:

struct Seller { 
    var firstName: String? 
    var lastName: String? 
    var address: String? 
} 

Ich habe ein Protokoll für diese erstellt und machte meinen Verkäufer es struct nehmen. Also mein Code sieht nun wie folgt aus:

protocol SellerProtocol { 
    var firstName: String {get set} 
    var lastName: String {get set} 
    var address: String {get set} 
} 

extension Seller: SellerProtocol { 
    var firstName: String? 
    var lastName: String? 
    var address: String? 
} 

Frage: ist es eine Möglichkeit, alle Variablen in diesem Protokoll nicht optional dynamisch zu machen?

Die Sache ist, ich habe viele solche optionalen Protokolle, aber ich muss auch eine nicht-optionale Version des exakt gleichen Protokolls deklarieren, so dass andere Klassen damit übereinstimmen können. Ich möchte nur, dass die Strukturen, die direkt mit dem Server interagieren, vom optionalen Typ sind (weil die Daten vom Server Nils enthalten können), aber nachdem ich die Informationen vom Server verarbeitet habe, möchte ich eine nicht optionale Struktur erstellen.

Also muss ich zwei Versionen des exakt gleichen Protokolls pflegen? Eine optionale Version und eine nicht optionale Version?

+1

Ich glaube, was Sie tun möchten, ist das Protokoll als nicht-optional zu deklarieren, dann verwenden Sie einen Failable-Initialisierer, um Ihre Struktur zu erstellen. Wenn Sie bestimmte Eigenschaften vermissen, schlägt die Objektinitialisierung fehl, aber wenn die Initialisierung erfolgreich ist, verfügen Sie über alle erforderlichen Daten. – AdamPro13

+0

danke .. aber warum hast du keine Antwort geschrieben? Ich kann einen Kommentar nicht als Antwort akzeptieren. –

+0

@ AdamPro13: Ich stimme zu, das ist der Weg zu gehen –

Antwort

1

Was Sie tun möchten, ist das Protokoll als nicht optional deklarieren, dann verwenden Sie einen fehlgeleiteten Initialisierer, um Ihre Struktur zu erstellen. Wenn Sie bestimmte Eigenschaften vermissen, schlägt die Objektinitialisierung fehl, aber wenn die Initialisierung erfolgreich ist, verfügen Sie über alle erforderlichen Daten.

Sie können auf diesen Link verweisen, wenn Sie Hilfe bei der Erstellung eines failable initializer benötigen.

1

Nein, es gibt keine Möglichkeit, die erforderlichen Eigenschaften/Methoden eines Protokolls oder die darin verwendeten Typen dynamisch zu ändern. Protokolle sind Verträge, die der Compiler invariant berücksichtigen muss, um Ihren Code zu analysieren und zu validieren. Das Ändern eines Protokolls (oder welcher Protokolle ein Typ entspricht) zur Laufzeit würde im Wesentlichen die Verträge brechen, die Sie dem Compiler zur Build-Zeit versprochen haben.

Es scheint mir, dass Ihr SellerProtocol nicht optionals einschließen sollte, wenn ein Verkäufer absolut erwartet wird, diese Eigenschaften in Ihrer Anwendung zu haben. An dem Punkt, an dem Sie Daten vom Server erhalten, warum ist es erforderlich, dass eine transiente/temporäre Repräsentation von möglicherweise null Daten überhaupt mit diesem Protokoll übereinstimmt? Es sieht so aus, als ob nur dann, wenn die Daten nicht fehlen/fehlen, Sie einen SellerProtocol-konformen Typ damit füllen würden.