Проблема с назначением объекта для значения ключа - PullRequest
0 голосов
/ 28 января 2020

Я пытаюсь инициализировать некоторые значения, используя в моем интерфейсе словарь. Это значения в словаре:

{
  "d":[],
  "tH":123456789213,
  "e":NO,
  "a":"on"
}

Для инициализации я использую следующий метод:

- (id)initWithDict:(NSDictionary *)dict{

    self = [super initWithDict: dict];
    self.targetHour = [dict objectForKey:@"tH"];
    self.action = [dict objectForKey:@"a"];
    self.days = [dict objectForKey:@"d"];
    self.enabled = [dict objectForKey:@"e"];


    if(!dict[@"id"]){

        self.id = [[NSDate date] timeIntervalSince1970];
    }

    return self;
}

Не все значения верны, кроме self.enabled, который по какой-то причине присваивается YES вместо NO. Я не могу понять, что не так и почему он продолжает получать неправильное значение.

1 Ответ

1 голос
/ 28 января 2020

NO определяется как 0 (хотя в современных системах он попадает туда через __objc_no, это все равно 0 в этом контексте). Вы не можете поместить это в NSDictionary. Если бы вы это сделали, это было бы то же самое, что и nil, и действовало бы как удаление ключа.

Я подозреваю, что на самом деле это @NO, который является NSNumber-версией значения и является объектом (так можно положить в NSDictionary). (Я подозреваю это, потому что у вас также есть [] в вашем словаре, что также невозможно в NSDictionary. Поскольку NO также недействительно JSON, я не думаю, что вы показываете нам реальные данные. )

Если self.enabled является BOOL, то когда вы извлекаете objectForKey:, он возвращает объект и пытается присвоить значение BOOL. Вероятно, объект является теговым указателем, но его общее значение, вероятно, ненулевое. Ненулевые значения являются истинными.

Однако в этом случае я бы ожидал предупреждения. Вы разрешили все предупреждения в этом проекте?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...