it-swarm.com.de

So verwenden Sie eine Objective-C # -Definition von Swift

Ich migriere eine UIViewController-Klasse, um mit Swift ein wenig zu trainieren. Ich benutze erfolgreich Objective-C-Code über den Bridging-Header, aber ich muss eine Konstantendatei importieren, die #define-Direktiven enthält.

Ich habe in Swift mit Cocoa und Objective-C (Einfache Makros) Folgendes gesehen:

Einfache Makros

Wenn Sie normalerweise mit der Direktive #define eine primitive Konstante in C und Objective-C definieren, verwenden Sie in Swift stattdessen eine globale Konstante. Beispielsweise kann die Konstantendefinition #define FADE_ANIMATION_DURATION 0.35 in Swift besser mit let FADE_ANIMATION_DURATION = 0.35 ausgedrückt werden. Da einfache konstantenartige Makros direkt den globalen Variablen von Swift zugeordnet werden, importiert der Compiler automatisch einfache Makros, die in den Quelldateien C und Objective-C definiert sind.

Es scheint also möglich zu sein. Ich habe die Datei mit meinen Konstanten in den Überbrückungsheader importiert, aber ich habe keine Sichtbarkeit von meiner .Swift-Datei, kann nicht aufgelöst werden.

Was muss ich tun, um meine Konstanten für Swift sichtbar zu machen?

UPDATE:

Es scheint mit NSString Konstanten zu arbeiten, aber nicht mit Booleans:

#define kSTRING_CONSTANT @"a_string_constant" // resolved from Swift
#define kBOOL_CONSTANT YES // unresolved from Swift
64
atxe

Im Moment werden einige #defines konvertiert und andere nicht. Genauer:

#define A 1

...wird:

var A: CInt { get }

Oder:

#define B @"b"

...wird:

var B: String { get }

Leider werden YES und NO vom Swift-Compiler nicht sofort erkannt und konvertiert.

Ich schlage vor, Sie konvertieren Ihre #defines in tatsächliche Konstanten, was ohnehin besser ist als #defines.

.h:

extern NSString* const kSTRING_CONSTANT;
extern const BOOL kBOOL_CONSTANT;

m

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

Und dann wird Swift sehen:

var kSTRING_CONSTANT: NSString!
var kBOOL_CONSTANT: ObjCBool

Eine andere Option wäre, Ihre BOOL-Definition in zu ändern

#define kBOOL_CONSTANT 1

Schneller. Aber nicht so gut wie tatsächliche Konstanten.

Nur eine kurze Erläuterung einiger Dinge von oben.

Die Swift-Konstante wird mit dem Schlüsselwortlet ausgedrückt.

Zum Beispiel:

    let kStringConstant:String = "a_string_constant"

Nur in einer Protokolldefinition können Sie {get} verwenden. Beispiel:

    protocol MyExampleProtocol {
        var B:String { get }
    }
22
Joshua

In Swift können Sie eine Enumeration, eine Variable oder eine Funktion außerhalb einer Klasse oder Funktion deklarieren. Sie ist in allen Klassen (global) verfügbar (ohne dass eine bestimmte Datei importiert werden muss).

  import Foundation
  import MapKit

 let kStringConstant:String = "monitoredRegions"

  class UserLocationData : NSObject {    
class func getAllMonitoredRegions()->[String]{
     defaults.dictionaryForKey(kStringConstant)
 }
8
Ankish Jain

einfache Swift-Sprache benötigt keine Makros Alle #define-Anweisungen . werden gelassen, und komplexe Makros sollten in func konvertiert werden

0
Amr Angry

Die Alternative für Makro kann eine globale Variable sein. Wir können globale Variablen außerhalb der Klasse deklarieren und ohne Klassen auf diese zugreifen. Ein Beispiel finden Sie unten

import Foundation let BASE_URL = "www.google.com"

klassentest {

}

0
Ankit garg