6

重複の可能性:構造体
を NSObject にラップする方法
新しい Clang Objective-C リテラルをカスタム クラスにリダイレクトできますか?

私はカスタム構造体を持っています:

typedef struct {
    float f1;
    float f2;
} MYCustomStruct;

に追加する必要がありNSArrayます。これらの構造体を作成するためのカテゴリを既に作成しNSValues、それを に追加しましたがNSArray、可能であれば、ボックス化された式を使用してさらに単純化したいと考えています。これができるようになりたいです:

@[@(instanceOfMYCustomStruct)];

ただし、次のエラーに直面しています。

ボックス式で不正な型 'MYCustomStruct' が使用されています

カスタム構造体でボックス式を使用する方法はありますか?

4

1 に答える 1

4

NSValue組み込みのサポートがあるため、構造体をボックス化するためにa を使用します。残念ながら、objective-c のクールなリテラルを使用することはできません。

struct foo myStruct;
NSValue *val = [NSValue valueWithBytes:&myStruct objCType:@encode(typeof(myStruct))];

// to pull it out...
struct foo myStruct;
[val getValue:&myStruct];

これは、他の objc コードの中で扱いにくく醜いかもしれませんが、自問する必要がありますstruct。そもそもなぜ Objective-C で a を使用しているのですか? 少数のオブジェクトを使用することで得られる速度パフォーマンスはほとんどありませ@propertyん。私が見ることができる唯一の本当の理由は、メモリ レイアウトとの互換性のために C ライブラリと統合している場合であり、その場合でも、objective-c の構造スーパークラスが変更されない限り、オブジェクトのメモリ レイアウトは明確に定義されています。

では、 struct をボクシングする本当の目的は何ですか? それがあれば、さらにお手伝いできます。

于 2012-10-29T16:30:30.563 に答える