web-dev-qa-db-fra.com

Comment utiliser un Objective-C #define de Swift

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 avec let 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
64
atxe

Pour le moment, certains #defines 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 #defines en constantes réelles, ce qui est mieux que #defines 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 }
    }
22
Joshua

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)
 }
8
Ankish Jain

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

0
Amr Angry

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 {

}

0
Ankit garg