Je migre une classe UIViewController
pour m'entraîner un peu avec Swift. J'utilise avec succès le code Objective-C via l'en-tête de pontage, mais j'ai besoin d'importer un fichier de constantes contenant les directives #define
.
J'ai vu dans Utilisation de Swift avec Cocoa et Objective-C (Macros simples) comme suit:
Macros simples
Là où vous utilisiez généralement la directive
#define
pour définir une constante primitive en C et en Objective-C, utilisez plutôt une constante globale dans Swift. Par exemple, la définition constante#define FADE_ANIMATION_DURATION 0.35
peut être mieux exprimée dans Swift aveclet FADE_ANIMATION_DURATION = 0.35
. Etant donné que les macros simples et similaires sont directement mappés aux variables globales Swift, le compilateur importe automatiquement les macros simples définis dans les fichiers source C et Objective-C.
Donc, il semble que c'est possible. J'ai importé le fichier contenant mes constantes dans l'en-tête de pontage, mais je n'ai aucune visibilité depuis mon fichier .Swift
, je ne peux pas le résoudre.
Que dois-je faire pour rendre mes constantes visibles à Swift?
METTRE À JOUR:
Cela semble fonctionner avec des constantes NSString
, mais pas avec des booléens:
#define kSTRING_CONSTANT @"a_string_constant" // resolved from Swift
#define kBOOL_CONSTANT YES // unresolved from Swift
Pour le moment, certains #define
s sont convertis et d'autres non. Plus précisement:
#define A 1
...devient:
var A: CInt { get }
Ou:
#define B @"b"
...devient:
var B: String { get }
Malheureusement, YES
et NO
ne sont pas reconnus et convertis à la volée par le compilateur Swift.
Je vous suggère de convertir votre #define
s en constantes réelles, ce qui est mieux que #define
s de toute façon.
.h:
extern NSString* const kSTRING_CONSTANT;
extern const BOOL kBOOL_CONSTANT;
.m
NSString* const kSTRING_CONSTANT = @"a_string_constant";
const BOOL kBOOL_CONSTANT = YES;
Et ensuite Swift verra:
var kSTRING_CONSTANT: NSString!
var kBOOL_CONSTANT: ObjCBool
Une autre option serait de changer votre BOOL
définit en
#define kBOOL_CONSTANT 1
Plus rapide. Mais pas aussi bon que les constantes réelles.
Juste une petite précision sur quelques petites choses d’en haut.
Les constantes de Swift sont exprimées à l'aide du mot-clélet
Par exemple:
let kStringConstant:String = "a_string_constant"
De plus, vous pouvez utiliser {get} uniquement dans une définition de protocole, par exemple:
protocol MyExampleProtocol {
var B:String { get }
}
Dans Swift, vous pouvez déclarer une énumération, une variable ou une fonction en dehors de toute classe ou fonction et elle sera disponible dans toutes vos classes (globalement) (sans avoir besoin d'importer un fichier spécifique).
import Foundation
import MapKit
let kStringConstant:String = "monitoredRegions"
class UserLocationData : NSObject {
class func getAllMonitoredRegions()->[String]{
defaults.dictionaryForKey(kStringConstant)
}
le langage Swift simple n’a pas besoin de macros toutes les directives #define . seront laissées et les macros complexes doivent être converties en fonctions
L'alternative pour la macro peut être une variable globale. Nous pouvons déclarer une variable globale en dehors de la classe et accéder à celles-ci sans utiliser la classe. Veuillez trouver un exemple ci-dessous
importer Foundation let BASE_URL = "www.google.com"
test de classe {
}