usos sistema programacion origen operativo lenguaje fundamentals caracteristicas objective-c macros swift

objective c - sistema - Cómo usar un Objective-C#define de Swift



swift versions (5)

La alternativa para macro puede ser una variable global. Podemos declarar la variable global fuera de la clase y acceder a aquellos sin usar la clase. Por favor, encuentre el ejemplo a continuación

Importar fundación: BASE_URL = "www.google.com"

prueba de clase {

}

Estoy migrando una clase UIViewController para entrenar un poco con Swift. Estoy utilizando con éxito el código de Objective-C a través del encabezado de puente, pero tengo la necesidad de importar un archivo de constantes que contenga las directivas #define .

He visto en Usar Swift con Cocoa y Objective-C (macros simples) lo siguiente:

Macros simples

Donde normalmente #define directiva #define para definir una constante primitiva en C y Objective-C, en Swift usas una constante global. Por ejemplo, la constante definición #define FADE_ANIMATION_DURATION 0.35 se puede expresar mejor en Swift con let FADE_ANIMATION_DURATION = 0.35 . Debido a que las macros simples de tipo constante se asignan directamente a las variables globales de Swift, el compilador importa automáticamente las macros simples definidas en los archivos fuente C y Objective-C.

Por lo tanto, parece que es posible. He importado el archivo que contiene mis constantes en el encabezado de puente, pero no tengo visibilidad desde mi archivo .swift , no se puede resolver.

¿Qué debo hacer para que mis constantes sean visibles para Swift?

ACTUALIZAR:

Parece que funciona con constantes de NSString , pero no con booleanos:

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


Por el momento, algunos #define s se convierten y otros no. Más específicamente:

#define A 1

... se convierte en:

var A: CInt { get }

O:

#define B @"b"

... se convierte en:

var B: String { get }

Desafortunadamente, YES y NO no son reconocidos y convertidos sobre la marcha por el compilador Swift.

Sugiero que convierta su #define a constantes reales, que es mejor que #define todos modos.

.h:

extern NSString* const kSTRING_CONSTANT; extern const BOOL kBOOL_CONSTANT;

.metro

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

Y luego Swift verá:

var kSTRING_CONSTANT: NSString! var kBOOL_CONSTANT: ObjCBool

Otra opción sería cambiar tu BOOL define a

#define kBOOL_CONSTANT 1

Más rápido. Pero no tan bueno como las constantes reales.


Rápidamente puede declarar una enumeración, variable o función fuera de cualquier clase o función y estará disponible en todas sus clases (globalmente) (sin la necesidad de importar un archivo específico).

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


Solo una aclaración rápida sobre algunas cosas de arriba.

Swift Constant se expresan usando la palabra clave let

Por ejemplo:

let kStringConstant:String = "a_string_constant"

Además, solo en una definición de protocolo puede usar {get}, ejemplo:

protocol MyExampleProtocol { var B:String { get } }


el lenguaje simple y veloz no necesita una macro para todas las directivas #define. se dejará y las macros complejas deberían convertirse en funciones