Wie erstelle ich ein importierbares Modul in Swift?

74

Ich habe Apples Dokumentation für Swift gelesen und kann nichts darüber finden, wie Module erstellt oder Klassen- oder Strukturmitglieder als privat oder öffentlich definiert werden.

Es gibt Verweise auf die import-Anweisung in der Syntax, aber ich kann keine Informationen darüber finden, was sie tut oder wie sie verwendet wird.

Weiß jemand, wo ich das finden kann?

Sprinter
quelle
11
Off-Topic? Ernsthaft? Derzeit sind keine Ressourcen für Module bekannt, die schnell helfen. Andere finden Informationen äußerst wertvoll. Das ist nicht subjektiv, weil es noch nichts gibt!
Brett Ryan
Ich habe kürzlich einige Erkenntnisse darüber erhalten, wie Module (C, C ++) mit Swift Compiler - Suchpfaden (Xcode 6 Build Settings) in Swift importiert werden . Ich hoffe es hilft.
Vladof81

Antworten:

-1

Aktualisieren

Sie können ein schnelles Projekt mithilfe von Frameworks modularisieren.

Wir modularisieren, indem wir für jedes Modul separate Framework-Projekte erstellen und diese über den Xcode-Arbeitsbereich verknüpfen. Es sieht natürlicher aus, wenn wir die Komponenten in verschiedene Projekte aufteilen und sicherstellen, dass nur eine einseitige Kommunikation zwischen den Modulen besteht. Entwickler können isoliert arbeiten / testen, ohne viel über andere Module nachzudenken.

Standardmäßig haben Klassen / Strukturen / usw., die in einem Framework erstellt wurden, einen internalZugriffskontrolltyp, sodass er nur in den Modulen sichtbar ist. Um es außerhalb des Moduls sichtbar zu machen, können Sie es machen public.

Weitere Informationen zur Zugriffskontrollebene finden Sie hier


Das neueste Beta-Update für Xcode 6 (Beta 4) ermöglicht eine schnelle Zugriffskontrolle

Swift Aktiviert die Zugriffssteuerung

Die schnelle Zugriffskontrolle verfügt über drei Zugriffsebenen:

  • Auf private Entitäten kann nur aus der Quelldatei zugegriffen werden, in der sie definiert sind.
  • Auf interne Entitäten kann überall innerhalb des Ziels zugegriffen werden, wo sie definiert sind.!
  • Auf öffentliche Entitäten kann von überall innerhalb des Ziels und von jedem anderen Kontext aus zugegriffen werden, der das Modul des aktuellen Ziels importiert.
Clement Prem
quelle
32
Wie hilft diese Antwort jemandem, ein importierbares Modul in Swift zu erstellen?
Andrew Paul Simmons
Durch die Frameworkisierung des Projekts wird die Startleistung verringert. Jedes Framework benötigt Zeit zum Laden.
Kelin
Ja, die dynamische Verknüpfung verlangsamt den App-Start. Apple schlägt einen Schwellenwert von 6 dynamischen Frameworks vor. In Xcode 9 können Sie jedoch die Verknüpfung zur statischen Bibliothek in Mach-O Type ändern, um das Startproblem zu beheben. Für weitere Informationen developer.apple.com/videos/play/wwdc2016/406
Clement Prem
25

In Swift bezieht sich "Module" auf Frameworks. Xcode verfügt jetzt über eine Vorlage zum Erstellen eines Framework-Projekts für iOS und OS X.

Derzeit gibt es keine Möglichkeit, Methoden oder Eigenschaften als öffentlich / geschützt zu deklarieren. Wenn Sie möchten, dass dies als Feature hinzugefügt wird, können Sie eine Feature-Anfrage bei Apples Bug Reporter stellen . Es sollte auch beachtet werden, dass Apple angegeben hat, dass sich die Sprache mit jeder Version von Xcode ändern kann, sodass es möglich ist, dass Mitgliederzugriffsebenen vor der öffentlichen Version hinzugefügt werden.

Austin
quelle
1
Danke für diese Antwort. Ich hatte der Grundsatzrede entnommen, dass eines der Hauptprobleme in ObjC, das Swift ansprach, die Fähigkeit war, Code mithilfe von Namespaces zu modularisieren. Ich bin sicher, dass sie beabsichtigen, dass sich dies auf etwas anderes bezieht als das Erstellen von Frameworks für jedes Modul - das wäre viel Aufwand und würde keine Hierarchie von Modulen unterstützen. Um ehrlich zu sein, fühlt es sich so an, als wäre es unvollendet auf den Markt gebracht worden. Ich bin sicher, dass einige dieser Funktionen schnell hinzugefügt werden und es lohnt sich wahrscheinlich, dass wir Entwickler ein paar Releases abwarten, bevor wir sie verwenden.
Sprinter
1
Ja, ich hatte nach dem gleichen Thema gefragt, und der Ingenieur sagte, es sei eine der am häufigsten nachgefragten Funktionen. Also ist es definitiv auf ihrem Radar
Austin
Im Moment können Sie dies tun, indem Sie eine Klasse mit Mitgliedsklassen erstellen. Ich weiß, dass es nicht dasselbe ist, aber es funktioniert ähnlich.
o.uinn
8

Es gibt auch eine Möglichkeit, ein Modul selbst zu erstellen, aber es ist etwas schwieriger.

Wenn man sich anschaut , werden xcrun swift -helpSie vielleicht ein paar Optionen sehen, und es gibt -emit-module, -emit-libraryund -emit-objectdie vielleicht nützlich sein, aber wahrscheinlich sollten Sie offiziellen Weg bevorzugen und verteilen Module über Frameworks.

Wenn Sie das Modul dennoch selbst erstellen möchten, können Sie dieses Handbuch mit einigen Erklärungen lesen

AlexDenisov
quelle
Schöne Informationen. Dies kann auch ohne Xcode oder REPL verknüpft werden. Obwohl es verrückt ist, dass man es nicht swiftmodulebenutzen kann --sdk iphoneos.
Vladof81
Sie können SWM (Swift Modules) verwenden, um die importierbaren .swiftmoduleBinärdateien zu erstellen - github.com/jankuca/swm
JK
-2

Apple erwähnte, dass private Methoden noch nicht existieren, aber gerade implementiert werden. Denken Sie daran, dass dies eine neugeborene Sprache ist und sich noch im Aufbau befindet.

elito25
quelle
1
Diese Frage stellt keine Fragen zum privaten Zugang.
Kevin
-4

Swift 4.0

Beschreibung aus dem Kapitel "Zugriffskontrolle" im Apple-Buch " The Swift Programming Language (Swift 4 Edition) "

Swift bietet fünf verschiedene Zugriffsebenen für Entitäten in Ihrem Code. Diese Zugriffsebenen beziehen sich auf die Quelldatei, in der eine Entität definiert ist, und auch auf das Modul, zu dem die Quelldatei gehört.

  • openZugriff und publicZugriff ermöglichen die Verwendung von Entitäten in einer beliebigen Quelldatei aus ihrem definierenden Modul sowie in einer Quelldatei aus einem anderen Modul, das das definierende Modul importiert. Normalerweise verwenden Sie offenen oder öffentlichen Zugriff, wenn Sie die öffentliche Schnittstelle zu einem Framework angeben. Der Unterschied zwischen offenem und einem anderen Modul, das das definierende Modul importiert. Normalerweise verwenden Sie offenen oder öffentlichen Zugriff, wenn Sie die öffentliche Schnittstelle zu einem Framework angeben.
  • internalMit access können Entitäten in jeder Quelldatei ihres definierenden Moduls verwendet werden, jedoch nicht in einer Quelldatei außerhalb dieses Moduls. Normalerweise verwenden Sie den internen Zugriff, wenn Sie die interne Struktur einer App oder eines Frameworks definieren.
  • fileprivateDer Zugriff beschränkt die Verwendung einer Entität auf die eigene definierende Quelldatei. Verwenden Sie den dateiprivaten Zugriff, um die Implementierungsdetails einer bestimmten Funktionalität auszublenden, wenn diese Details in einer gesamten Datei verwendet werden.
  • privateDer Zugriff beschränkt die Verwendung einer Entität auf die einschließende Deklaration und auf Erweiterungen dieser Deklaration, die sich in derselben Datei befinden. Verwenden Sie den privaten Zugriff, um die Implementierungsdetails einer bestimmten Funktionalität auszublenden, wenn diese Details nur in einer einzigen Deklaration verwendet werden. “
luics
quelle
Die Informationen in dieser Antwort sind bereits in der akzeptierten Antwort angesprochen (siehe den Link dort)
Benutzer, der kein Benutzer ist