it-swarm.com.de

Xcode 6 / Beta 4: Die Verwendung von Bridging-Headern mit Framework-Zielen wird nicht unterstützt

Ich habe gerade ein Upgrade auf Xcode 6 Beta 4 durchgeführt und ein Framework für Live Views in Beta 2 erstellt. Aufgrund eines anderen Swift Bug musste ich ein Obj verwenden -C-Code. Beim Upgrade wird jedoch die folgende Fehlermeldung angezeigt:

fehler: Die Verwendung von Bridging-Headern mit Framework-Zielen wird nicht unterstützt

Ich habe in den Versionshinweisen nichts gesehen oder einen anderen Migrationspfad gefunden. Hat dies jemand anderes gesehen und ist zu einer Lösung gekommen?

Mir ist klar, dass Beta 3 keine Frameworks für Live Views mehr benötigt, aber in meinem Fall ist es sinnvoll, wenn ich es zum Laufen bringen kann. Ich kann es zwar als Fallback entfernen, würde aber lieber ein Framework verwenden, wenn sie in Beta 4 nicht völlig kaputt sind.

118
Chris Conover

Wie der Fehler besagt, sind Bridging-Header in Frameworks nicht zulässig. Der Abschnitt Importieren von Code aus demselben Framework-Ziel im Abschnitt Mix & Match Apple Hinweise zur Dokumentation: Wie bereits erwähnt, müssen Sie "in Ihre Umbrella-Header-Datei jeden Objective-C-Header importieren, den Sie für Swift verfügbar machen möchten".

Ich habe jedoch festgestellt, dass Sie möglicherweise auch diese spezifischen Header veröffentlichen müssen. In dieser Antwort erfahren Sie, warum und wie Sie dies tun: Swift-Compiler-Fehler: "Nicht modularer Header innerhalb des Framework-Moduls" .

Also mach das:

  1. Entfernen Sie Ihre Überbrückungsheaderdatei.
  2. Entfernen Sie in den Buildeinstellungen für das Framework Verweise auf die Bridging-Header-Datei
  3. Fügen Sie der Umbrella-Datei ([ProductName] .h) die erforderlichen Header hinzu.
  4. Veröffentlichen Sie die enthaltenen Dateien im Abschnitt "Header" des Frameworks unter "Build-Phasen".
  5. Reinigen und wieder aufbauen.

Hinweis : Die "Umbrella-Header-Datei" ist eine Datei (mit dem Namen [ProductName] .h), die im Allgemeinen alle öffentlichen Header eines Frameworks darstellt. In der Regel handelt es sich nur um eine Liste von # import-Anweisungen für andere im Framework enthaltene Header. Wenn Sie UIKit.h in Xcode öffnen, sehen Sie ein gutes Beispiel für eine Umbrella-Datei.

207

Es gibt zwei Möglichkeiten. Das Hinzufügen der erforderlichen Header zur Umbrella-Header-Datei und deren Veröffentlichung ist eine Möglichkeit. Dies ist jedoch ein Problem, wenn die Header Swift zur Verfügung stehen sollen, aber nicht öffentlich.

Die zweite Möglichkeit, interne Header für Swift verfügbar zu machen, wird ausführlich beschrieben hier . Im Wesentlichen muss eine Modulzuordnung erstellt werden, die der folgenden ähnelt:

module AwesomeKitPrivate {  
  header "../InternalClass.h"
  export *
}

Dies kann dann in XCode mit der Einstellung aufgenommen werden:

Swift_INCLUDE_PATHS = $(SRCROOT)/AwesomeKit/ProjectModule  
22
Jan Rüegg

Siehe Importieren von Objective-C in Swift .

So importieren Sie Objective-C-Code aus demselben Framework in Swift

  1. Vergewissern Sie sich, dass unter "Build-Einstellungen" unter "Verpackung" die Einstellung "Modul definieren" für dieses Framework-Ziel auf "Ja" festgelegt ist.
  2. Importieren Sie in Ihre Umbrella-Header-Datei jeden Objective-C-Header, den Sie für Swift verfügbar machen möchten. Beispielsweise:

     #import "XYZ/XYZCustomCell.h" 
     #import "XYZ/XYZCustomView.h" 
     #import "XYZ/XYZCustomViewController.h" 
    
  3. Veröffentlichen Sie die enthaltenen Dateien im Abschnitt "Header" des Frameworks unter "Build-Phasen".

  4. Reinigen und wieder aufbauen.

Swift sieht jeden Header, den Sie öffentlich machen, in Ihrem Umbrella-Header. Der Inhalt der Objective-C-Dateien in diesem Framework ist in jeder Swift - Datei innerhalb dieses Framework-Ziels automatisch ohne Importanweisungen verfügbar. Verwenden Sie Ihren benutzerdefinierten Objective-C-Code mit der gleichen Syntax Swift wie für Systemklassen.

let myOtherCell = XYZCustomCell()
myOtherCell.subtitle = "Another custom cell"

Wichtig: Die "Umbrella-Header-Datei" bezeichnet die Datei {ModuleName} .h. Übrigens lautet der Zielname {ModuleName} .framework.

9
Ralph Shane