So importieren Sie eigene Klassen aus Ihrem eigenen Projekt in einen Spielplatz


77

Nehmen Sie ein Setup wie folgt an:

  • Sie haben ein Xcode 6-Projekt, in dem Sie Ihre eigenen Klassen (z. B. MyView und MyViewController) mit Objective-C und Swift implementiert haben
  • Sie haben Ihrem Projekt einen Spielplatz hinzugefügt

Auf dem Spielplatz ist es möglich, Module (Frameworks) wie UIKitmit dem importSchlüsselwort zu importieren . Wie können Sie vom Spielplatz aus auf die anderen Klassen des Projekts zugreifen?

Der Versuch, direkt auf Projektklassen zuzugreifen, führt zu einer Fehlermeldung: Verwendung des nicht aufgelösten Bezeichners 'MyView'


1
Ich wünschte, es gäbe eine aktuelle Antwort auf diese Frage (7.3+)
Travis Griggs


Bitte überprüfen Sie diese Frage und Antwort: stackoverflow.com/questions/28301662/…
FreeSoul

Antworten:


57

Ab Xcode 6.0 Beta 5 ist es jetzt möglich, eigene Frameworks in einen Spielplatz zu importieren. Auf diese Weise können Sie Code zwischen Ihren Anwendungen und Spielplätzen austauschen, wodurch beide Ihre Frameworks importieren können. Um dies zu tun:

  1. Ihr Spielplatz muss sich im selben Arbeitsbereich befinden wie das Projekt, das Ihr Framework erstellt. Ihr Arbeitsbereich muss ein Ziel enthalten, das das Framework erstellt, anstatt ein vorgefertigtes Framework zu verwenden.

  2. Sie müssen Ihr Framework bereits erstellt haben. Wenn es sich um ein iOS-Framework handelt, muss es für ein 64-Bit-Ausführungsziel (z. B. iPhone 5s) und für den Simulator erstellt werden.

  3. Sie müssen über ein aktives Schema verfügen, das mindestens ein Ziel erstellt (der Build-Speicherort dieses Ziels wird im Framework-Suchpfad für den Spielplatz verwendet).

  4. Ihre Einstellung "Build Location" (in den erweiterten "Locations" -Einstellungen von Xcode) sollte nicht auf "Legacy" gesetzt sein.

  5. Wenn Ihr Framework kein Swift-Framework ist, muss die Build-Einstellung "Defines Module" auf "Yes" gesetzt werden.

  6. Sie müssen Ihrem Spielplatz eine Importanweisung für das Framework hinzufügen.

Sobald alle diese Bedingungen erfüllt sind, funktioniert der Import Ihres Frameworks auf einem Spielplatz.

In Xcode 7 haben wir einen weiteren Mechanismus eingeführt, mit dem Sie Ihre eigenen Klassen als Quelle importieren können, anstatt ein Framework zu importieren. Weitere Informationen zu dieser Unterstützung für "Hilfsquellen" finden Sie unter http://help.apple.com/xcode/mac/8.0/#/devfa5bea3af


"Spielplätze unterstützen den Import von Frameworks." XCode 6 Beta 5 Änderungsprotokoll
Albert Bori

109
Zu kompliziert. Apple sollte es einfacher machen.
Ramis

6
Es ist also nicht möglich, Klassen von einem App-Ziel zu importieren, oder?
Bilby91

5
Dies scheint in Xcode 6.1 nicht zu funktionieren. Ich habe die oben genannten Anforderungen von Ballard befolgt, die hier als Tutorial wiedergegeben werden , und die Importanweisung auf dem Spielplatz löst einen Fehler aus.
Ybakos

4
Nur eine Anmerkung: Sie müssen Simulator Binary erstellen . Das Erstellen einer Gerätebinärdatei hat keine Auswirkung. (Xcode Version 6.3.2 (6D2105))
eonil

18

Auf diese Weise konnte ich tatsächlich auf andere Swift-Dateien im aktuellen Projekt verweisen:

  • Erstellen Sie einen leeren Spielplatz und platzieren Sie sich irgendwo unter Ihrem Projekt.
  • Öffnen Sie das YourPlayground.playgroundBundle (ja, es ist ein Bundle = Verzeichnis) in Terminal.
  • Bearbeiten Sie contents.xcplaygroundzum Beispiel mit viund fügen Sie einen weiteren Abschnitt wie diesen hinzu:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<playground version='3.0' sdk='iphonesimulator'> 
   <sections>
       <code source-file-name='section-1.swift'/>
       <code source-file-name='section-2.swift'/>
   </sections>
   <timeline fileName='timeline.xctimeline'/>
</playground>
  • Umbenennen section-1.swiftin section-2.swift(Wenn Sie den Spielplatz von Grund auf neu erstellt haben, sollte section-1.swiftIhr Bundle ein Beispiel enthalten. )
  • Fügen Sie einen festen Link (symbolischer Link scheint nicht zu funktionieren) mit dem Namen hinzu, section-1.swiftder außerhalb des Bundles auf Ihre Swift-Klassendatei verweist, wie:
ln ../../Classes/MyView.swift section-1.swift
  • Schließen Sie Xcode und öffnen Sie den Spielplatz erneut.
  • Jetzt sollte es zwei Abschnitte geben, einen mit dem Inhalt Ihrer Swift-Klassendatei und den anderen mit dem Beispielinhalt, den Sie beim Erstellen des Spielplatzes von Grund auf erhalten haben.

Auf diese Weise kann ich tatsächlich Code ausführen, der außerhalb des Spielplatzes liegt, aber Xcode scheint dabei häufiger abzustürzen.

Bearbeiten:

Ab Xcode 6 Beta 5 können Sie jetzt auf Projektdateien verweisen, wie Rick Ballard in seiner Antwort anweist .


1
Beachten Sie, dass dadurch dieselbe Datei an zwei Stellen angezeigt und bearbeitet werden kann. Wenn Sie style='setup'dem <code>Tag hinzufügen , wird es als reduzierter / erweiterbarer Block angezeigt. Dies ist möglicherweise idealer, da die zusätzliche Datei bis zu einem gewissen Grad ausgeblendet wird.
Christopher Swasey

12

Seit Beta 5 von Xcode 6 ist es möglich, Ihren Code zu importieren, wenn er sich in einem Framework befindet. Sie müssen lediglich ein Framework-Ziel erstellen, die Swift-Dateien dort hinzufügen und auf Ihrem Spielplatz ausführen

import ModuleName

Sie können den Modulnamen in den Build-Einstellungen nachschlagen. Es ist normalerweise das gleiche wie der Zielname.

Denken Sie daran, den Code zu erstellen, den Sie sehen möchten public. Sie müssen das Projekt erstellen, bevor Änderungen auf dem Spielplatz verfügbar sind. (Sie müssen auch den Spielplatz bearbeiten, um eine erneute Ausführung auszulösen.)

Wichtig

Geben Sie der Spielplatzdatei nicht den gleichen Namen wie dem Ziel! Wenn Sie dies tun, scheint der Import zu funktionieren, aber Sie werden die folgende Fehlermeldung erhalten, wenn der Spielplatz versucht, auszuführen:

Ausführung des Spielplatzes fehlgeschlagen: Fehler: Symbole konnten nicht gesucht werden:

Ich habe eine Stunde damit verschwendet, das herauszufinden. :) :)


Der Namenstipp war mein Problem. Ich danke dir sehr!
mxcl

2
Tipp: Sie müssen keine Symbole als deklarieren public. Markieren Sie einfach Ihren Import als@testable import ModuleName
John Estropia

10

Ich konnte es mit keiner der Antworten hier zum Laufen bringen, also fing ich an herumzuspielen und fand einen einfachen Weg, der für mich funktionierte, um eine schnelle Klasse auf einen Spielplatz zu importieren.

Erstellen Sie einfach einen Spielplatz in Ihrem Projekt, es gibt ein Verzeichnis mit dem Namen "Quellen", ziehen Sie einfach eine Kopie der schnellen Klasse in diesen Ordner und der Spielplatz hat dann Zugriff darauf.

Zum Beispiel:

Geben Sie hier die Bildbeschreibung ein


4
Das hat bei mir funktioniert. Denken Sie bei anderen Noobs daran, dass Sie auch Dinge deklarieren public, die Sie auf dem Spielplatz verwenden möchten. developer.apple.com/library/ios/documentation/Swift/Conceptual/… - Ich habe noch keine Swift-Ressource gefunden, die die Lücke zwischen dem Erlernen von Swift (einfach) und der tatsächlichen Organisation eines Swift-Projekts in XCode (bisher sehr unintuitiv) schließt. .
Danneu

4

Ich habe nur Links zu allen meinen schnellen Dateien in den SourcesOrdner eingefügt:

cd /path/to/project/MyPlayground.playground/Sources
ln -s ../../*.swift .

Auf diese Weise werden Änderungen in Ihrer Quelldatei sofort auf Ihrem Spielplatz wirksam. Hat sehr gut funktioniert .

Xcode 8.2, Swift 3.0.1, macOS Sierra


gibt 'Keine solche Verzeichnisdatei' zurück. Können Sie bitte helfen
ZaEeM ZaFaR

-1

Alles was Sie tun müssen - ist am Anfang zu schreiben:

import ModuleName

(vorausgesetzt, Ihr Spielplatz befindet sich im selben Arbeitsbereich wie das Framework / Projekt)

Wenn es nicht funktioniert:

  1. Erstellen Sie Ihr Projekt neu

  2. Erstellen Sie den Spielplatz neu und kopieren Sie alles vom alten Spielplatz

Es löst viele seltsame Fehler mit fehlgeschlagenen Inits und Importen von was auch immer!

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.