頭と尻尾はくれてやる!

パソコンおやじのiPhoneアプリ・サイト作成・運営日記


配列に入れた構造体は書き換えるのに一手間必要

頭と尻尾はくれてやる! / 構造体の定義部分にカテゴリで拡張しておく
↑構造体を配列(NSMutableArray)に入れるとかこの記事などいくつか書いてきたんだけど、実際使っていると書き換える時に不便なことがわかったんだよ。配列に入れて後で出して値を得る、ってだけなら問題なかったんだけどね。

例えばこんな構造体を定義したとするよ。
typedef struct {
    CGPoint p0;
    CGPoint p1;
    CGPoint p2;
    CGPoint p3;
} BezierPoints_t;
最近ベジェ曲線をいじってるから作ったんだけどね。ともかくこれを配列で管理したいので出し入れのためのカテゴリを記述したのよ。
@implementation NSMutableArray (AddBezierPointsInfo)
-(void)addBezierPointsInfo:(BezierPoints_t)bezierPointsInfo
{
    NSValue *value = [NSValue value:&bezierPointsInfo withObjCType:@encode(BezierPoints_t)];
    [self addObject:value];
}
@end

@implementation NSArray (GetBezierPointsInfo)
-(BezierPoints_t)bezierPointsInfoAtIndex:(int)index
{
    NSValue *value = [self objectAtIndex:index];
    BezierPoints_t bezierPointsInfo;
    [value getValue:&bezierPointsInfo];
    return bezierPointsInfo;
}
@end
↑実装部分だけだけどこんな感じになる。前の記事と同じでNSValueを介してる。
ここまではいいんだよ。
この構造体を扱う場合に、値を変更する必要があってさ。例えば、
{
    BezierPoints_t bezierPointsInfo = [bezierPointsInfoArray bezierPointsInfoAtIndex:ii];
    bezierPointsInfo.p0 = newPoint;//書き換え
}
ってするだけじゃだめなんだよ。最初なんでだめなのーって頭抱えてたんだけどね。
カテゴリーの内容をよく見るとbezierPointsInfoAtIndex:メソッドで得た値はNSValueで得たオブジェクトをコピーしているわけだから、直接書き換えられてるわけじゃない。

ってこと本当に書き換えるのならそれ用のメソッドも作っておくかってことで、、、
@implementation NSMutableArray (ReplaceBezierPointsInfo)
-(void)replaceBezierPointsInfo:(BezierPoints_t)bezierPointsInfo index:(int)index
{
    NSValue *value = [NSValue value:&bezierPointsInfo withObjCType:@encode(BezierPoints_t)];
    [self replaceObjectAtIndex:index withObject:value];
}
@end
こんな感じに。おまけで、下のは途中に追加のメソッドも。
@implementation NSMutableArray (InsertBezierPointsInfoAtIndex)
-(void)insertBezierPointsInfo:(BezierPoints_t)bezierPointsInfo atIndex:(int)index
{
    NSValue *value = [NSValue value:&bezierPointsInfo withObjCType:@encode(BezierPoints_t)];
    [self insertObject:value atIndex:index];
}
@end

<< ベジェ曲線を分割する方法   TopPage  SpriteKitの物理エンジン使ってみた >>

コメント


管理者にだけ表示を許可する
 

トラックバック

トラックバックURL
http://ringsbell.blog117.fc2.com/tb.php/814-02663920




Copyright ©頭と尻尾はくれてやる!. Powered by FC2 Blog. Template by eriraha.

FC2Ad