2017-03-09 5 views
0

Ich versuche ein NSNumber-Objekt zu erstellen. Ich habe diese Codes in objc:Swift 3 Erstellen eines NSNumber-Objekts

@property (nonatomic, assign) Enum someEnum; 

static NSString *const value_type = @"type"; 

- (id)initWithDictionary:(NSDictionary *)dict andUID:(int)uid { 
    self.someEnum = [[dict objectForKey:value_type] integerValue]; 
    } 

- (NSDictionary *)serializeToDictionary { 
    dict[value_type] = [NSNumber numberWithInteger:self.someEnum]; 
} 

Wie dieser Code würde in schnellen 3 gleichwertig sein? Ich fand, dass in swift NSNumber init (Wert:) Symbol, aber es nur ein Objekt initialisieren, nicht erstellen und initialisieren. Und das init (value:) gibt einen Fehler aus, der darauf hinweist, "value" in "coder" zu ändern. Mein Swift Code:

var someEnum = Enum.self 

let value_type: NSString = "type" 

init(dictionary dict: NSDictionary, andUID uid: Int) { 
    self.someEnum = dict.object(forKey: value_type) as! Enum.Type 
} 

func serializeToDictionary() -> NSDictionary { 
    dict[value_type] = NSNumber.init(value: self.someEnum) 
} 

Objective-C-Header-Datei:

typedef enum { 
    EnumDefault = 0, 
    EnumSecond = 1 
} Enum; 

static NSString *const value_type = @"type"; 

@property (nonatomic, assign) Enum someEnum; 

Objective C Implementierungsdatei:

- (id)initWithDictionary:(NSDictionary *)dict andUID:(int)uid { 
    if(self = [super init]) { 
    self.someEnum = [[dict objectForKey:value_type] integerValue]; 
    } 
    return self 
} 

- (NSDictionary *)serializeToDictionary { 
    NSMutableDictionary *dict = [NSMutableDictionary dictionary]; 
    dict[value_type] = [NSNumber numberWithInteger:self.someEnum]; 

    return dict; 
} 

Antwort

1
var someEnum = Enum.self 

Der Wert someEnum ist ein Typ, kein spezifischer Wert. Das ist dein erster Fehler.

Sie wollen wahrscheinlich etwas wie

var someEnum: Enum = ... // (your default value) 

Jetzt

dict[value_type] = NSNumber.init(value: self.someEnum) 

Aufzählungen werden nicht automatisch in Ints umgewandelt. Nehmen wir an, Enum wird durch einen Int Wert unterstützt (was nicht für alle Enums gilt). Als Sie verwenden können:

dict[value_type] = NSNumber(value: self.someEnum.rawValue) 

oder nur

dict[value_type] = self.someEnum.rawValue as NSNumber 

Voll Code (es ist keine gute Idee zu verwenden NS(Mutable)Dictionary in Swift und Ausnahmezustände, die ich unter Verwendung gelöst ! besser gelöst werden sollte).

enum Enum : Int { 
    case `default` = 0 
    case second = 1 
} 

class Test { 
    var someEnum: Enum = .default 
    let valueType: String = "type" 

    init(dictionary: NSDictionary, andUID uid: Int) { 
     self.someEnum = Enum(rawValue: (dictionary[valueType] as! NSNumber).intValue) ?? .default 
    } 

    func serializeToDictionary() -> NSDictionary { 
     let dictionary = NSMutableDictionary() 
     dictionary[valueType] = self.someEnum.rawValue as NSNumber 

     return dictionary 
    } 
} 
+0

Meine Enum ist Int-Typ. Ich habe versucht, Ihren Code, aber es heißt - Kann nicht konvertieren Wert des Typs "Class.Enum.RawValue.Type (aka Int.Type) zu NSNumber in Notzustand geben –

+0

@KasparsLapins Haben Sie den" ersten Fehler "Kommentar in der Spitze? – Sulthan

+0

Project kompiliert mit diesem Code, aber tut es das gleiche? Dict [value_type] = self.someEnum.rawValue() as NSNumber –

Verwandte Themen