WedX - журнал о программировании и компьютерных науках

Доступ к данным из NSDictionary

Я использую следующий метод для доступа к данным об объекте. Первый NSLog показывает все данные. Второй NSLog показывает данные «кадра», которые выглядят как: NSRect: {{168, 102}, {5, 5}}

Как я могу получить доступ к первому набору координат из NSRect, а затем к абсциссе из первой пары?

-(void) moveTheShape:(NSTimer*)timer
{
    NSDictionary *userInfo = [timer userInfo];
    NSLog(@"Info:  %@",userInfo);
    //Info:  <Shape: 0x68b6c30; frame = (151 352; 5 5); layer = <CALayer: 0x68b6c00>>
    NSDictionary *frame = [userInfo  valueForKey:@"frame"];
    NSLog(@"frame: %@", frame);
    //NSRect: {{168, 102}, {5, 5}}
}

ПРАВИЛЬНОЕ РЕШЕНИЕ:

-(void) moveTheShape:(NSTimer*)timer
{
Shape *userInfo = [timer userInfo];
NSLog(@"Info:  %@",userInfo);
CGPoint origin = userInfo.frame.origin;
NSLog(@"result: %f", origin.x);
}
08.06.2012

  • Как правило, вы должны использовать objectForKey: при доступе к объектам, хранящимся в NSDictionary. 08.06.2012
  • NSDictionary *origin = [userInfo valueForKey:@origin]; 08.06.2012
  • Мне кажется, что ваша userInfo не NSDictionary; скорее это похоже на Shape. 08.06.2012

Ответы:


1

Если моя догадка о типе userInfo верна:

-(void) moveTheShape:(NSTimer*)timer
{
    Shape *userInfo = [timer userInfo];
    CGPoint origin = userInfo.frame.origin;
    // Do stuff with origin
}
08.06.2012

2

CGRect хранится как NSValue. Вам нужно будет получить CGRectValue из NSValue.

Используйте следующее

NSValue *value = [userInfo valueForKey:@"frame"];
CGRect rect = [value CGRectValue];
08.06.2012
  • NSValue *value = [userInfo objectForKey:@frame]; дал мне следующую ошибку: -[Shape objectForKey:]: нераспознанный селектор отправлен в экземпляр 08.06.2012
  • но в своем коде вы написали, что NSLog(@frame: %@, frame); дал вам результат, код, который вы написали, правильный? 08.06.2012
  • Я проверил: написанный мной код выводит в NSLog следующее: NSRect: {{168, 102}, {5, 5}} 08.06.2012

  • 3

    целое число абсцисс = frame.origin.x; даст вам значение x. Вы используете frame.size.width и frame.size.height, чтобы получить размеры.

    08.06.2012
  • Это дает ошибку: Семантическая проблема: свойство «происхождение» не найдено в объекте типа «NSDictionary». 08.06.2012
  • Эта строка: NSDictionary *frame = [userInfo valueForKey:@frame]; неправильно. Это должно быть NSRect frame = [userInfo valueForKey:@frame]; 08.06.2012
  • Это дало мне: Семантическая проблема: использование необъявленного идентификатора «NSRect» 08.06.2012
  • Ой, извините, это iOS (хм... почему в логе написано NSRect?). Вместо этого вы должны использовать CGRect. 08.06.2012

  • 4

    Ха, abscissa, мое новое слово на сегодня!

    Во всяком случае, вы имеете в виду CGRect, поскольку iPhone использует CoreGraphics, а не FoundationKit для всех прямоугольников UIKit.

    Что касается доступа к внутренним переменным структуры (точнее, CGPoint и CGSize), просто используйте обычную старую точечную нотацию после сохранения кадра в переменную CGRect следующим образом:

    NSValue *value = [userInfo objectForKey:@"frame"];
    CGRect frameVar = [value CGRectValue];
    frameVar.origin = CGPointMake(someCoord, someOtherCoord);
    
    08.06.2012
    Новые материалы

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..

    ИИ в аэрокосмической отрасли
    Каждый полет – это шаг вперед к великой мечте. Чтобы это происходило в их собственном темпе, необходима команда астронавтов для погони за космосом и команда технического обслуживания..


    Для любых предложений по сайту: [email protected]