2014-10-20 8 views
12

die Dokumentation sagt:Swift Globals und globale Funktionen in Ziel c

Globale Konstanten in C definiert und Objective-C-Quelldateien werden durch die Swift-Compiler als Swift globale Konstanten automatisch importiert.

Aber es sagt nichts über den umgekehrten Weg. Ich muss eine globale schnelle Konstante definieren und sie auf der objektiven c-Seite wie eine globale c-Konstante sehen können. Wie auf der schnellen Seite definieren:

public let CARDS = ["card1", "card2"] 

und verwenden Sie es auf dem Ziel c Seite sehen wie

NSLog(@"Cards count: %d", [CARDS count]) 

Was soll ich tun? Ich habe importiert bereits die rasche automatisch generierten Header wie:

#import "MyProject-Swift.h" 

und in Xcode, wenn ich command-click drauf, es nimmt mich an die richtige Stelle in der SWIFT-Code, aber bei der Kompilierung ich:

'User of undeclared Identifier CARDS' 

auf meiner objektiven c-Seite.

+0

Globals definiert in Swift kann derzeit nicht mit Objective-C verwendet werden – aleclarson

Antwort

26

Here is the document darüber

Sie werden innerhalb einer Klasse oder Protokoll Zugriff auf alles haben, die mit dem @objc Attribut gekennzeichnet ist, solange es mit Objective-C kompatibel ist. Dies schließt Swift-only-Funktionen wie diejenigen hier aufgeführt:

  • Generics
  • Tupeln
  • Aufzählungen definiert in Swift
  • Strukturen definiert in Swift
  • Top-Level-Funktionen definiert in Swift
  • Globale Variablen definiert in Swift
  • Typaliases definiert in Swift
  • Swift-Stil variadics
  • Verschachtelte Typen
  • Curried Funktionen

Globale Variablen (einschließlich Konstanten) sind unaccessible von Objective-C.

Stattdessen müssen Sie eine Klasse deklarieren, die über Zugriffsmethoden für die globalen Konstanten verfügt.

// Swift 
public let CARDS = ["card1", "card2"] 

@objc class AppConstant { 
    private init() {} 
    class func cards() -> [String] { return CARDS } 
} 

// Objective-C 
NSArray *cards = [AppConstant cards]; 
+0

Wow Apple ... so viel für die Interoperabilität. Mehr wie müssen Hacky-Klassen in Swift für jede schöne Sache schreiben, die schnell kann natürlich tun.Apple behebt bitte dieses Problem – Tim

+0

Eine weitere Option besteht darin, eine Header-Datei in Objective-C zu erstellen, die alle Konstanten zwischen Objective-C und Swift enthält und diese in alle Objective-C-Dateien importiert, die Zugriff auf die Konstanten sowie das Bridging des Projekts benötigen Header. –

+1

Das "Dies schließt Swift-only Features wie die hier aufgeführten aus:" Bit ist fressend. Globale Variablen und Funktionen auf globaler/oberster Ebene sind keine schnellen Funktionen. Ich kann eine globale Funktion in C oder Objective-C erstellen und sie ist in Swift sichtbar, aber ich kann das Gegenteil nicht tun. –