2 Stimmen

Wie man Enumerationswerte des Typs NSPersistentStoreUbiquitousTransitionType vergleicht

Beim Versuch, Werte zu vergleichen, die von der NSPersistentStoreCoordinatorStoresDidChangeNotification empfangen wurden, erhalte ich den folgenden Fehler

// Überprüfen des Übergangstyps
if let type = n.userInfo?[NSPersistentStoreUbiquitousTransitionTypeKey] as? UInt {

    FLOG(" Übergangstyp ist \(type)")

    if (type == NSPersistentStoreUbiquitousTransitionType.InitialImportCompleted) {
            FLOG(" Übergangstyp ist NSPersistentStoreUbiquitousTransitionTypeInitialImportCompleted")
    }

}

Aber ich erhalte den folgenden Compilerfehler

NSPersistentStoreUbiquitousTransitionType ist nicht in UInt konvertierbar

Gerade wenn ich denke, dass ich Swift verstanden habe, stehe ich wieder vor einem Rätsel!

3voto

Nate Cook Punkte 90484

Dies ist der seltene Fall, in dem der Compiler Ihnen tatsächlich genau sagt, was falsch ist! Typ ist ein UInt, während NSPersistentStoreUbiquitousTransitionType.InitialImportCompleted ein Fall von Enum ist. Um sie zu vergleichen, müssen Sie sie auf die gleiche Seite bringen - es ist wahrscheinlich am sichersten, den Rohwert des Enums zu erhalten:

if (type == NSPersistentStoreUbiquitousTransitionType.InitialImportCompleted.toRawValue()) {
    FLOG(" Übergangstyp ist NSPersistentStoreUbiquitousTransitionTypeInitialImportCompleted")
}

Hinweis: in Xcode 6.1 haben sich Enums geringfügig geändert, daher würden Sie .rawValue anstelle von .toRawValue() verwenden.

Um es andersherum zu behandeln, müssten Sie die Daten aus der Benachrichtigung in einen Enum-Wert konvertieren. Die Dokumentation besagt: "Der entsprechende Wert ist einer der NSPersistentStoreUbiquitousTransitionType Enum-Werte als NSNumber-Objekt." Der erste Teil Ihres Codes ist also genau richtig, und dann müssten Sie die statische Methode fromRaw(number) des Enums verwenden:

if let type = n.userInfo?[NSPersistentStoreUbiquitousTransitionTypeKey] as? Uint {
    // Konvertieren in ein Enum und den optionalen Rückgabewert auspacken
    if let type = NSPersistentStoreUbiquitousTransitionType.fromRaw(type) {
        // Jetzt können Sie direkt mit dem gewünschten Fall vergleichen    
        if (type == .InitialImportCompleted) {
            // ...
        }
    }
}

Hinweis: in Xcode 6.1 würden Sie NSPersistentStoreUbiquitousTransitionType(rawValue: type) anstelle der Methode fromRaw() verwenden.

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