Swift 3创建NSNumber对象

时间:2017-03-09 08:58:36

标签: ios objective-c swift nsnumber

我试图创建一个NSNumber对象。 我在objc中有这个代码:

 @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];
}

这段代码在swift 3中的效果如何? 我发现在swift NSNumber中有init(value :)符号,但它只是初始化一个对象,而不是创建和初始化。并且init(value :)会抛出一个错误,这意味着要改变" value"到"编码员"。 我的Swift代码:

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头文件:

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

static NSString *const value_type = @"type";

@property (nonatomic, assign) Enum someEnum;

Objective C实现文件:

- (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;
}

1 个答案:

答案 0 :(得分:2)

var someEnum = Enum.self

someEnum的值是Type,而不是特定值。那是你的第一个错误。

你想要的可能是

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

现在

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

枚举不会自动转换为整数。假设EnumInt值支持(对于所有枚举都不是这样)。比你可以使用:

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

或只是

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

完整代码(在Swift中使用NS(Mutable)Dictionary并不是一个好主意,我使用!解决的异常状态应该更好地解决。)

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
    }
}