2014-10-20 16 views
12

la documentazione dice:globali Swift e funzioni globali in Objective C

costanti globali definite in C e file sorgenti Objective-C sono automaticamente importati dal compilatore Swift come Swift costanti globali.

Ma non dice nulla del contrario. Devo definire una costante rapida globale ed essere in grado di vederla come il lato obiettivo c come una costante globale. Come sul lato rapida definire:

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

e vedere usarlo sul lato Objective C come

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

Cosa devo fare? Ho già importato la rapida intestazione generata automaticamente come:

#import "MyProject-Swift.h" 

e in Xcode se command-click su di esso, ci metto al posto giusto nel codice swift, ma al momento della compilazione ottengo:

'User of undeclared Identifier CARDS' 

sul lato obiettivo c.

+0

Globali definiti a Swift non può attualmente essere utilizzato con Objective-C – aleclarson

risposta

26

Here is the document su di esso

Avrai accesso a qualsiasi cosa all'interno di una classe o un protocollo che è contrassegnati con l'attributo @objc purché compatibile con Objective-C. Ciò esclude Swift-solo le caratteristiche come quelli elencati qui:

  • Generics
  • tuple
  • enumerazioni definite a Swift
  • strutture definite a Swift
  • funzioni di primo livello definiti Swift
  • Variabili globali definite in Swift
  • Le tipealie definite in Swift
  • Swift stile variadics
  • tipi nidificati
  • funzioni curry

variabili globali (tra cui costanti) sono inaccessibile da Objective-C.

Invece, è necessario dichiarare una classe che ha accessors per le costanti globali.

// 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 mela ... così tanto per l'interoperabilità. Più piacere scrivere classi di hacker in fretta per ogni cosa carina che può fare in modo naturale.Apple aggiusta questo – Tim

+0

Un'altra opzione è creare un file di intestazione in Objective-C che contenga tutte le costanti condivise tra Objective-C e Swift e importarlo in qualsiasi file Objective-C che ha bisogno di accedere alle costanti e al bridging del progetto intestazione. –

+1

Che "Questo esclude solo funzionalità di Swift come quelle elencate qui:" bit is galling. Le variabili globali e le funzioni globali/di livello superiore non sono funzioni solo rapide. Posso creare una funzione globale in C o Objective-C ed è visibile in Swift, ma non posso fare il contrario. –