3

Objective-C オブジェクトのプロパティ同士をバインドしたいのですが、プロパティが c++ クラスになっています。プロパティは実際には数学的なベクトル クラスであり、ベクトル演算では演算子のオーバーロードが非常に役立つため、操作が簡単です。(Objective-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 による問題: タイプ 'Vec3f' (別名 'Vec3') のアトミック プロパティが、非自明な代入演算子を使用してセッターを合成する

Cinder の Vec3f クラスを使用します: http://libcinder.org/docs/v0.8.3/classcinder_1_1_vec3.html

問題は、目的の c で c++ オブジェクトをプロパティとしてバインドする方法、または可能でしょうか? 他に行く方法はありますか?(客観的なcできれいなベクトル、行列などの数学を行う方法がわかっている場合は、私に知らせてください。)

これは私がドキュメントで見つけたものです:

スカラー値と構造体値の KVC 変換 KVC メソッド valueForKey: および setValue:forKey: のデフォルト実装は、BOOL、char、double、float、int などのスカラー データ型、および NSPoint、NSRange、NSRect などの構造体の自動オブジェクト ラッピングをサポートします。Cocoa スクリプトが valueForKey: を呼び出して値を取得すると、KVC は必要に応じて値を NSNumber オブジェクト (スカラーの場合) または NSValue オブジェクト (構造の場合) に自動的に変換します。同様に、setValue:forKey: は、指定されたキーの適切なアクセサーまたはインスタンス変数に必要なデータ型を決定します。データ型がオブジェクトでない場合、適切な NSNumber または NSValue メソッドを使用して、渡されたオブジェクトから値が抽出されます。サポートされている型の表を含む詳細については、「キー値コーディング プログラミング ガイド」の「スカラーと構造体のサポート」を参照してください。

それでも、NSRect のような構造体のラッパーがあります。元の valueForKey をオーバーライドする方法があるかもしれません: そのため、Vec3f も処理できます。

したがって、これが新しい質問になります: valueForKey:setValue: forKey:をオーバーライドして、自分の c++ オブジェクトを処理できるようにする方法は?

4

1 に答える 1

1

私はこれがうまくいくかどうか非常に疑っています。

バインディングは、Key-Valueコーディング(KVC)とKey-Value Observing(KVO)に基づいて構築されています。のキーパスを使用していますmanipulator.pos。つまり、manipulatorプロパティは、プロパティに対してKVCおよびKVOに準拠したObjective-Cオブジェクトである必要がありposます。明確ではありませんが、これM_NodeはObjective-CクラスではなくC ++クラスであるため、KVCまたはKVOに準拠していないと思われます。

次は、KVCがどのように戻り、pos到達できるかどうかの値を渡すかという問題です。KVCは、非オブジェクトデータ型をラップするNSNumberNSValue、それらを渡します。ただし、aVec3fが非PODの場合、それがうまく機能するとは思えません。

結局のところ、バインディングは魔法ではありません(ただし、確かに、KVOの実装には魔法に近いisa-swizzlingのものがいくつかあります)。重要なのは、それ[[yourObject valueForKey:@"manipulator"] valueForKey:@"pos"]がうまくいくと思いますか?あなたは[[yourObject valueForKey:@"manipulator"] setValue:someValue forKey:@"pos"]働くことを期待しますか?そうでない場合、バインディングが機能する可能性はありません。

于 2012-06-13T15:28:59.767 に答える