5 Stimmen

NSNumber aus Enum-Element in gemischt-sprachigem Projekt initialisieren

Ich habe ein gemischt-sprachiges Projekt, Objective C und Swift, in XCode 6.

Singleton.h

#import 

enum  {
    enum_A = 0,
    enum_B,
    enum_C,
    enum_D,
    enum_E,
    enum_F,
    enum_G,
} enums;

@interface Singleton : NSObject

+ (id)sharedSingleton;

@end

Singleton.m

// In dieser Datei ist nichts Besonderes

#import "Singleton.h"

static Singleton *shared = nil;

@implementation Singleton

- (id)init {
    self = [super init];
    if (self) {

    }
    return self;
}

#pragma mark - Interface

+ (Singleton *)sharedSingleton {
    static dispatch_once_t pred;

    dispatch_once(&pred, ^{
        shared = [[Singleton alloc] init];
    });

    return shared;
}

@end

ViewController.swift

import UIKit

class ViewController: UIViewController {

let singleton = Singleton.sharedSingleton() as Singleton

override func viewDidLoad() {
    super.viewDidLoad()
    // Führe nach dem Laden der Ansicht zusätzliche Setup-Arbeiten aus, üblicherweise aus einem Nib.

    let n = NSNumber(char: enum_E) // HIER ERSCHEINT DER FEHLER!!!
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Geb den ganzen unnötigen Speicher wieder frei.
}

}

(Natürlich musste ich eine Bridging-Header-Datei einrichten, in der #import "Singleton.h" hinzugefügt wurde).

Der FEHLER lautet:

Kann 'init' nicht mit einer Argumentliste vom Typ '(char: Int)' aufrufen

Es ist seltsam, dass Swift immer noch enum_E erkennen kann (ich sehe es blau hervorgehoben), aber trotzdem diesen Fehler anzeigt. Ich habe (char)enum_E versucht, aber ohne Erfolg.

Hast du irgendwelche Ideen?

Danke,

11voto

Nero Punkte 1275

Okay, anscheinend gibt es tatsächlich einen Unterschied zwischen enums, die in Objective-C und Swift erstellt wurden. Ich ging davon aus, dass es keinen Unterschied gibt, daher habe ich meinen Ansatz nur in einem Swift Playground getestet.


enum erstellt in Swift

// UInt32 hatte in beiden Beispielen denselben zugrunde liegenden Typ
enum TestEnum : UInt32 { 
    case A, B, C
}

var x = NSNumber(unsignedInt: TestEnum.C.rawValue)
// x == 2

Um den Rohwert aus einem Enum-Wert in Swift zu erhalten, musst du den Enum-Wert explizit in den Rohwert umwandeln. Dies kann durch Hinzufügen von .rawValue zu deinem Enum-Wert erreicht werden.


enum erstellt in Objective-C

Objective-C

enum TestEnum {
    A = 0,
    B = 1,
    C = 2
};

Swift

let x : TestEnum = C
var number = NSNumber(unsignedInt: C.value) // alternatively: x.value
println("the number is \(number)")
// Ausgabe: the number is 2

Der Unterschied zu den Swift enums scheint zu sein, dass du .value anstelle von .rawValueUInt32.

Getestet in Xcode 6.1.1, iOS SDK 8.1, iOS Simulator 8.1

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X