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 conlet 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