2012-06-13 2 views
3

Я хотел бы привязываться к объектам Objective-C друг к другу, но свойствами является класс C++. свойство фактически является математическим векторным классом, с которым легче работать, поскольку перегрузка оператора весьма полезна с векторной математикой. (Я даже не вижу хороший способ работать с векторной математикой с объектами-C, isthere?)Как связать объекты C++ как свойства в объективе-c?

Проблема в том, что привязка этого векторного свойства приводит к сбою приложения. вот пример:

@interface M_Node : NSObject{ 
Vec3f pos; 
M_Node *manipulator 
} 
@property Vec3f pos; 
@end 

@implementation 
@synthesize pos; 

@dynamic pos; 
-(void)setPos:(Vec3f)newPos{ 
pos=Vec3f(newPos); 
} 
-(Vec3f)pos{ 
return Vec3f(pos); 
} 

- (id) init 
{ 
self = [super init]; 
if (self != nil) { 
[self bind:@"pos" toObject:self withKeyPath:@"manipulator.pos" options:nil]; 
} 

return self; 
} 

вопрос по Xcode: Atomic свойства типа «Vec3f» (он же «Vec3») синтез сеттер с помощью нетривиального оператора присваивания

Я использую класс Vec3f из cinder: http://libcinder.org/docs/v0.8.3/classcinder_1_1_vec3.html

Вопрос в том, что как связывать объекты C++ как свойства в объективе-c, или это даже возможно? Есть ли другой способ? (В случае, если у вас есть какие-либо идеи, как сделать чистый вектор, матрица и т.д. математику в Objective-C, пожалуйста, дайте мне знать.)

Это то, что я нашел в документации:

КВЦ Конверсия Скалярные и структурные значения Стандартные реализации методов KVC valueForKey: и setValue: forKey: обеспечивают поддержку автоматической привязки объектов к скалярным типам данных, таким как BOOL, char, double, float, int и структуры, такие как NSPoint, NSRange, и NSRect. Когда скрипт Cocoa вызывает valueForKey: чтобы получить значение, KVC автоматически преобразует значение в объект NSNumber (для скаляров) или объект NSValue (для структур), если это необходимо. Аналогично, setValue: forKey: определяет тип данных, требуемый соответствующей переменной или переменной экземпляра для указанного ключа. Если тип данных не является объектом, то значение извлекается из переданного объекта с использованием соответствующего метода NSNumber илиNSValue. Дополнительные сведения, в том числе таблицу поддерживаемых типов, см. В разделе «Скалярная и структурная поддержка в кодировании с ключом». Руководство по программированию

По-прежнему существуют обертки для таких структур, как NSRect. Возможно, есть способ переопределить исходное значениеForKey: поэтому он также может обрабатывать Vec3f.

Так что это будет новый вопрос: Как переопределить valueForKey: и SetValue: forKey: так было бы в состоянии справиться с моей C++ объект?

+0

В инициализаторе вы пытались поместить [self bind: etc ... WITHIN в блок if (self! = Nil)? Все, что находится за пределами блока, подразумевает, что self может быть nil и компилятор будет пинать. – Patrick

+0

Фактически это была ошибка ввода. Оригинал находится внутри блока if. Я даже пытался связать два совершенно разных объекта снаружи. И он по-прежнему падает. – zalavari

+0

Вы пробовали реализовать сеттер самостоятельно? – zneak

ответ

1

Я очень сомневаюсь, что это сработает.

Привязки основаны на кодировании по значению ключа (KVC) и наблюдении за ключевыми значениями (KVO). Вы используете ключевой путь manipulator.pos. Это означает, что свойство manipulator должно быть объектом Objective-C, который является KVC- и KVO-совместимым для свойства pos. Непонятно, но я подозреваю, что M_Node - это класс C++, а не класс Objective-C, и, следовательно, он не является KVC- или KVO-совместимым ни для чего.

Следующий вопрос о том, как KVC вернется и передаст значение pos, если он сможет добраться до него. KVC будет обертывать не-объектные типы данных в NSNumber или NSValue, чтобы передать их. Однако, если Vec3f является не-POD, то я сомневаюсь, что это будет хорошо работать.

В конечном счете, привязки не являются волшебными (хотя, по общему признанию, в его реализации KVO имеет несколько заклинаний с заклинанием «магия»). Дело в том, можно ли ожидать, что [[yourObject valueForKey:@"manipulator"] valueForKey:@"pos"] будет работать? Ожидаете ли вы [[yourObject valueForKey:@"manipulator"] setValue:someValue forKey:@"pos"]? Если нет, то никаких шансов привязки не будет.

+0

Ну, я думаю, вы поняли. – zalavari

+0

Я нашел способ, который мог бы работать. (на самом деле stackoverflow еще не позволяет мне ответить на мой вопрос, поэтому я обновляю его сверху. – zalavari

+0

Я упомянул о вашей идее, но для того, чтобы она помогала работать, Vec3f должен был быть [ POD (простые старые данные)] (http://www.parashift.com/c++-faq-lite/intrinsic-types.html#faq-26.7) –

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