2013-11-14 2 views
1

У меня есть объект NSDictionary, который содержит пары (ключ, значение) (байт, пользовательский класс), где byte - typedef unsigned char byte.NSDictionary с байтом и объектами как значение ключа

Ниже мой код

в Mos6502.h

@interface Mos6502 : NSObject { 
@private 
    Instruction *currentInstruction; 
} 

@property NSDictionary *instructions; 

в Mos6502.m, в методе init я заполнил словарь с байтовым (неподписанным символом), который представляет опкод данной инструкции, а значение экземпляр класса инструкции. Как указано ниже

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

Где BRK и другие классы инструкций наследуются от базового класса, называемого инструкцией.

В том же файле, но в способе, где мне нужно, чтобы получить текущую инструкцию, следующая строка дает мне ошибку:

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

со следующим сообщением об ошибке,

Implicit conversion of 'byte' (aka 'unsigned char') to 'id' is disallowed with ARC

и когда я пытаюсь поставить вместо [mem readByteAt:(PC++)] такой номер, как 0x00 У меня больше нет ошибки.

Почему я получаю эту ошибку?

ответ

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

Ваша проблема заключается в:

  • 0x00 не является NSObject, вы можете только поставить NSObjects в словаре. Вы можете «вставить» примитив (сделать в эквивалент NSNumber), поставив @ перед ним. Попробуйте @ 0x00.

  • Я думаю, что у вас есть ключ и значение не так. В отличие от остального мира Apple помещает объект перед ключом в метод dictionaryWithObjectsAndKeys.

1

Вы не можете использовать байт как ключ в NSDictionary. Вы должны использовать объект. Попробуйте:

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

(Это использование новых примитивов объектов, которые легче, чем с помощью dictionaryWithObjectsAndKeys)

1

typedef unsigned char byte не делает byte в «класс».byte aka char - просто простой тип C, а не тип объекта или объекта; следовательно, ошибка компилятора.

вы должны либо поле значения в NSNumber (или некоторый пользовательский класса), а другие предполагают, или использовать NSMapTable в качестве словаря, который может хранить произвольные указатели как оба ключа и значение (не только Objective-C объекты как NSDictionary является Ограничен).

Смежные вопросы