Come usare un Objective-C #define di Swift

Sto migrando una class UIViewController per allenarmi un po ‘con Swift. Sto usando con successo il codice Objective-C tramite l’intestazione del bridging ma ho bisogno di importare un file costanti che contiene le direttive #define .

Ho visto in Uso di Swift con Cocoa e Objective-C (macro semplici) il seguente:

Macro semplici

Dove in genere hai usato la direttiva #define per definire una costante primitiva in C e Objective-C, in Swift usi invece una costante globale. Ad esempio, la definizione costante #define FADE_ANIMATION_DURATION 0.35 può essere espressa meglio in Swift con let FADE_ANIMATION_DURATION = 0.35 . Poiché le semplici macro a forma di costante si mappano direttamente alle variabili globali di Swift, il compilatore importa automaticamente le macro semplici definite nei file di origine C e Objective-C.

Quindi, sembra ansible. Ho importato il file contenente le mie costanti nell’intestazione del bridging, ma non ho visibilità dal mio file .swift , non posso essere risolto.

Cosa devo fare per rendere visibili le mie costanti a Swift?

AGGIORNARE:

Sembra funzionare con costanti NSString , ma non con booleans:

 #define kSTRING_CONSTANT @"a_string_constant" // resolved from swift #define kBOOL_CONSTANT YES // unresolved from swift 

Al momento, alcuni #define vengono convertiti e altri no. Più specificamente:

 #define A 1 

… diventa:

 var A: CInt { get } 

O:

 #define B @"b" 

… diventa:

 var B: String { get } 

Sfortunatamente, YES e NO non sono riconosciuti e convertiti al volo dal compilatore Swift.

Ti suggerisco di convertire i tuoi #define in costanti reali, che è comunque meglio di #define s.

.h:

 extern NSString* const kSTRING_CONSTANT; extern const BOOL kBOOL_CONSTANT; 

.m

 NSString* const kSTRING_CONSTANT = @"a_string_constant"; const BOOL kBOOL_CONSTANT = YES; 

E poi Swift vedrà:

 var kSTRING_CONSTANT: NSString! var kBOOL_CONSTANT: ObjCBool 

Un’altra opzione potrebbe essere quella di cambiare il tuo BOOL definisce a

 #define kBOOL_CONSTANT 1 

Più veloce. Ma non buono come le costanti attuali.

Solo un rapido chiarimento su alcune cose dall’alto.

La costante rapida è espressa usando la parola chiave let

Per esempio:

  let kStringConstant:String = "a_string_constant" 

Inoltre, solo in una definizione di protocollo puoi usare {get}, esempio:

  protocol MyExampleProtocol { var B:String { get } } 

In swift puoi dichiarare un enum, una variabile o una funzione al di fuori di qualsiasi class o funzione e sarà disponibile in tutte le tue classi (globalmente) (senza la necessità di importare un file specifico).

  import Foundation import MapKit let kStringConstant:String = "monitoredRegions" class UserLocationData : NSObject { class func getAllMonitoredRegions()->[String]{ defaults.dictionaryForKey(kStringConstant) } 

L’alternativa per la macro può essere una variabile globale. Possiamo dichiarare la variabile globale al di fuori della class e accedere a quelli senza utilizzare la class. Si prega di trovare l’esempio qui sotto

import foundation lascia BASE_URL = “www.google.com”

test di class {

}

linguaggio semplice e veloce non hanno bisogno di macro tutte le direttive #define. sarà lasciato e le macro complesse dovrebbero convertirsi in func