2016-11-30 2 views
1

Ich speichere Konstanten in einer objective-c Header-Datei wie vorgeschlagen here. Ich definiere ein NS_ENUM und auch ein konstantes Array, das gut in objective-c funktioniert, z. SDModeString (kSDOne). Allerdings kann ich das nicht von Swift angerufen bekommen. Ich bin mir sicher, dass ich hier etwas sehr dummes mache, aber ein Vorschlag, wie man SDModeString von Swift anruft, wäre zu begrüßen. Ich kann auf SDMode, aber nicht auf SDModeString zugreifen. Vielen Dank.Zugriff auf # define-Array in Swift

typedef NS_ENUM(NSInteger, SDMode) { 
    kSDOne, kSDTwo, kSDThree 
}; 
#define SDModeString(SDMode) [@[@"kSDOne",@"kSDTwo",@"kSDThree"]  objectAtIndex:SDMode] 

Antwort

4

Sie müssen SDModeString in eine richtige Funktion aktivieren, etwa so:

inline NSString *SDModeString(enum SDMode mode) { 
    return [@[ @"kSDOne", @"kSDTwo", @"kSDThree" ] objectAtIndex:mode]; 
} 

obwohl ich würde wahrscheinlich nur einen Schalter verwenden, schneller, sicherer etc:

inline NSString *SDModeString(enum SDMode mode) { 
    switch (mode) { 
    case kSDOne: return @"kSDOne"; 
    case kSDTwo: return @"kSDTwo"; 
    case kSDThree: return @"kSDThree"; 
    default: assert(false); 
    } 
} 
+2

Auch ich würde die Funktion 'NSStringFromSMMode' nennen, da dies die Apple API ist. – Sulthan

+0

@Sultan Das ist eigentlich ein anständiger Grund _not_ um es so zu nennen - Apple reserviert Zwei-Buchstaben-Präfixe für sich selbst, so ist es denkbar, dass, wenn sie ein Framework mit dem Präfix "SD" hatten und sie hatten einen 'SDMode', das ist was sie Benenne ihre eigene Funktion. Sie würden dann mit ihnen in Konflikt geraten und Linker-Fehler bekommen. Es ist sicherer, dies oder "SDStringFromMode" oder ähnliches zu nennen. –

+1

@ItaiFerber Wenn Sie dies als ein Problem betrachten, dann ist es die richtige Lösung, Ihre 'SD'-Präfixe in ein Drei-Buchstaben-Präfix zu ändern, um sich alternative Funktionsnamen nicht auszudenken, da' SDMode' enum bereits einen Namenskonflikt verursacht. – Sulthan

Verwandte Themen