2016-04-29 11 views
7

Ich habe einige schnelle Erweiterungen möchte ich über Projekte.Swift Erweiterungen, die nur beim Importieren von ihnen gelten

Ich möchte Kategorie Verschmutzung jedoch vermeiden, wenn diese Erweiterungen angefordert werden.

Ist es möglich, sie zu schreiben, so dass sie nur dann, wenn ich eine bestimmte Einfuhr getan haben, wie:

import MySwiftExtensions 

// Use custom extensions 
let x = [1,3,5,7].average() 
let y = [1,3,5,7].firstWhere { $0 > 3 } 
let z = "campervan".make1337() 

ich in einem einzigen Buchstaben Klasse gewickelt diese als statische Methoden schreiben könnte (zB: ø.average([1,3,5,7]) , wie lodash), um dasselbe zu erreichen, aber manchmal erhalten Sie viel prägnantere Verwendung von Instanzmethoden.

+6

Haben Sie versucht, die Erweiterungen in ein separates Framework zu setzen und nach Bedarf zu importieren? –

Antwort

2

Sie schrieb:

ich einige rasche Erweiterungen muss ich über Projekte wollen. ..

Wenn ich Code habe, den ich über Projekte hinweg verwenden möchte, erstelle ich ein separates Framework, um diesen Code zu halten. Wenn ich diesen Code dann in einem neuen Projekt verwenden möchte, bette ich das Framework in das Projekt ein. Oder, für Entwicklungszwecke, erstelle ich einen Arbeitsbereich, der das Projekt und das Framework enthält.Dadurch kann ich gleichzeitig an beiden arbeiten und das Framework nur dann in das Endprodukt einbetten, wenn es Zeit ist, es zu exportieren.

Sobald der Rahmen entweder eingebettet oder im selben Arbeitsbereich, dann sollten Sie in der Lage sein, es in jede einzelne Datei in Ihrem Projekt zu importieren, mit:

import MySwiftExtensions 

Jede Datei, die nicht die Import-Anweisung hat wird habe keinen Zugriff auf die Erweiterungen.

EDIT:

Hier ist a link zu einem Blog, das beschreibt, wie ein Cocoa Touch-Framework erstellen. Und hier ist another link, die detailliert beschreibt, wie Arbeitsbereiche verwendet werden, um Frameworks in Entwicklungsprojekten zu verwenden.

+0

Das klingt genau nach was ich will. Wie dies in xcode zu verwalten ist neu für mich. Haben Sie einen Link, der die Idee erklärt, ein Framework zu erstellen, es in den Arbeitsbereich zu integrieren und es in das Endprodukt zu integrieren (vielleicht [this] (https://www.raywenderlich.com/65964/create-a-framework -for-ios)?) – SimplGy

+0

Siehe meine bearbeitete Antwort, die einige Links enthält. –

+0

Es tut mir leid, nur eine Erhaltung. Ich verstehe die Notwendigkeit nicht. In meinem Projekt habe ich normalerweise eine einzige Datei mit allen Erweiterungen, was ist der Vorteil, ein Framework in ein anderes Projekt zu importieren, basierend auf 1 Datei für meinen Fall? Ist es nicht am schnellsten, es zu kopieren? –

1

würde Ich mag die Aufmerksamkeit auf das konzentrieren, was Sie berichtet: „..only gelten, wenn ich eine bestimmte Einfuhr gemacht habe ..“ Es würde auch bedeuten, Sie diese Erweiterungen wollen nur auf eine bestimmte Klasse applyed werden kann

Wie in diesem interessanten Apple-Blog chapter und in den offiziellen Apple-doc berichtete Sie den „Access Control“ Ihre Erweiterung

umgehen können Sie eine Klasse, Struktur oder Aufzählung in jedem Zugriff Kontext erstrecken können, in denen Die Klasse, Struktur oder Aufzählung ist verfügbar. Alle Typmitglieder, die in einer Erweiterung hinzugefügt wurden, haben den gleichen Standardzugriff level wie type members, die im ursprünglichen Typ deklariert sind, der erweitert wird. Wenn Sie einen öffentlichen oder internen Typ erweitern, haben alle neuen Typmember, die Sie hinzufügen, eine Standardzugriffsebene von internal. Wenn Sie einen privaten Typ erweitern, haben alle hinzugefügten neuen Typmitglieder eine Standardzugriffsebene von private. Alternativ können Sie eine Erweiterung mit einer expliziten Zugriffsebene Modifizierer (z. B. private Erweiterung) markieren, um einen neuen Standardzugriff Ebene für alle Mitglieder in der Erweiterung definiert festzulegen. Dieser neue Standardwert kann weiterhin innerhalb der Erweiterung für einzelne Mitglieder des Typs überschrieben werden.

/* no access level modifier: default access level will be 'internal' */ 
    extension UIViewSubClass 
    { 
     // default access level used: internal 
     var helloWorld : String { 
      get { 
       return "helloWorld" 
      } 
     } 
    } 

    // modify default access level to public 
    public extension UIViewSubClass 
    { 
     // default access level used: public 
     var helloWorld : String { 
      get { 
       return "helloWorld" 
      } 
     } 
    } 

Die Mitglieder von Erweiterungen markiert private innerhalb der Datei zur Verfügung stehen, wo sie definiert sind, und außerhalb dieser Datei nicht zur Verfügung. Außerhalb der Datei, in der die privaten Verlängerungselemente definiert wurden, jeder Versuch, sie zu einem Fehler führt zu verwenden, und die automatische Vervollständigung würde sie nicht einmal Liste

// modify default access level to private 
private extension UIViewSubClass 
{ 

    var helloWorld : String { 
     get { 
      return "helloWorld" 
     } 
    } 
} 
0

ich Sie tun nicht glauben können, was Sie wollen pro se, aber ich habe den folgenden Ansatz zu bieten Funktionalität nur auf die spezifische Klasse verwendet, die eine Schnittstelle implementiert:

protocol ExampleProtocol { 

} 

extension ExampleProtocol where Self: UIViewController{ 

    // extend what you need to here 
} 
Verwandte Themen