NSDictionary以字节和对象作为键值

时间:2013-11-14 20:47:23

标签: objective-c nsdictionary implicit-conversion

我有一个NSDictionary对象,其中包含(字符,自定义类)({1}}为byte的(键,值)对。

以下是我的代码

typedef unsigned char byte

中的

Mos6502.h

@interface Mos6502 : NSObject { @private Instruction *currentInstruction; } @property NSDictionary *instructions; 中,在Mos6502.m方法中,我用字节(unsigned char)填充字典,该字节表示指令的操作码,值是指令类的实例。如下所示

init

其中BRK和其他指令类继承自名为Instruction的基类。

在同一个文件中,但在我需要获取当前指令的方法中,以下行给出了错误:

instructions = [NSDictionary dictionaryWithObjectsAndKeys: 0x00, [[BRK alloc] init], // rest of the instructions nil];

,出现以下错误消息,

currentInstruction = [instructions objectAtKey:[mem readByteAt:(PC++)]];

当我尝试将Implicit conversion of 'byte' (aka 'unsigned char') to 'id' is disallowed with ARC替换为[mem readByteAt:(PC++)]之类的数字时,我不会再出现错误。

为什么我收到此错误?

4 个答案:

答案 0 :(得分:2)

你的问题是:

  • 0x00不是NSObject,您只能将NSObject放入字典中。您可以通过在其前面放置@来“封装”一个原语(make into NSNumber等效)。试试@ 0x00。

  • 我认为你的关键和价值是错误的。与世界其他地方不同,Apple将对象放在dictionaryWithObjectsAndKeys方法的Key之前。

答案 1 :(得分:1)

你可以在NSNumber存储一个字符然后存储,但集合类中的值必须是Obj-C值。

也......密钥必须支持NSCopying.

instructions = @{@(0x00) : [[BRK alloc] init] };

  instructions = [NSDictionary dictionaryWithObjectsAndKeys:
                  [NSNumber numberWithChar:0x00], [[BRK alloc] init],
                  // rest of the instructions
                  nil];

答案 2 :(得分:1)

您不能将字节用作NSDictionary中的键。你必须使用一个对象。尝试:

instructions = @{@0 : [BRK new]};

(这是使用比使用dictionaryWithObjectsAndKeys更容易的新对象原语)

答案 3 :(得分:1)

typedef unsigned char byte不会将byte变成“类”。 byte aka char只是一个普通的C类型,而不是对象或对象类型;因此编译错误。

您必须像其他人建议的那样将值设置为NSNumber(或某些自定义类),或者使用NSMapTable作为您的字典,它可以将任意指针存储为键和值(不仅仅是像NSDictionary这样的objective-c对象仅限于)。