2013-03-18 2 views
7

Я пытаюсь дать значение ключа NSDictionary для CGSize, и XCode дает мне эту ошибку. Мой код:Элемент коллекции типа «CGSize» не является объектом Objective-C

 NSArray *rows = @[ 
     @{@"size" : (CGSize){self.view.bounds.size.width, 100} 
      } 
     ]; 

Почему я могу исправить ошибки здесь? Если его невозможно сохранить CGSize в dict, то какой альтернативный подход?

EDIT: теперь получает "Используемый тип 'CGSize' (он же 'структура CGSize'), где арифметика, указатель, или вектор типа требуется" ошибка с этим кодом:

NSDictionary *row = rows[@0]; 
CGSize rowSize = [row[@"size"] CGSizeValue] ? : (CGSize){self.view.bounds.size.width, 80}; 

ответ

21

CGSize не объект. Это C-структура. Если вам нужно сохранить это в коллекции Obj-C стандартным способом является окружив его NSValue, например, так:

NSArray *rows = @[ 
@{@"size" : [NSValue valueWithCGSize:(CGSize){self.view.bounds.size.width, 100}] 
    } 
]; 

Тогда позже, когда вам нужно получить CGSize обратно, вы просто вызвать метод -CGSizeValue, например

CGSize size = [rows[0][@"size"] CGSizeValue]; 
+0

Это действительно позор, вы не можете поставить произвольную С-структуру в Objective-C объекта, используя новый синтаксис литерала. Единственная реальная трудность, которую я видел, - это разобраться с селекторами. –

+0

Как назначить блок как значение, возвращающее CGSize? Похоже на «Лямбду» в Python – zakdances

+1

@yourfriendzak: Это кажется немного абсурдным. –

0

Ответ Кевина работает только на iOS; для Mac OS X (какао) делать:

[NSValue valueWithSize:NSMakeSize(self.view.bounds.size.width, 100)]; 
Смежные вопросы