我有一个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++)]
之类的数字时,我不会再出现错误。
为什么我收到此错误?
答案 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对象仅限于)。