2012-03-04 3 views
2

私は、構造体を持っている:iOS 5:plistファイルに構造体を書き込むことは可能ですか?以下で定義されているよう

typedef struct { 
    NSString *SportName; 
    NSInteger numberOfPeriods; 
    CFTimeInterval periodLength; 
    NSString *periodName; 
    CFTimeInterval secondaryClockTime; 
    NSString *LeftSecondaryCounterName; 
    NSString *RightSecondaryCounterName; 
    bool PossessionArrow; 
} GamePreset; 

それはplistファイルにタイプGamePresetの変数を記述することは可能ですか?

答えて

2

任意のstructをプロパティリストとして書き込むための組み込みサポートはありません。構造体をプロパティリストに変換するメソッドを記述する必要があります。理論的には

、あなたがGamePresetを記述した文字列で(コンパイル時に)置き換えられている、@encode(GamePreset)の結果を解析することによって、実行時にそれを行うことができます:

NSLog(@"encode = %s", @encode(GamePreset)); 
... 
2012-03-04 00:57:43.456 encodetest[43337:903] encode = {[email protected]@[email protected]@B} 

これは重大な欠点を有しています。 1つはあなたがフィールド名を取得していないので、あなたのplistはstructフォーマットを知っていなければ特に有用ではなく、structのレイアウトを変更すると、保存されたplistを読むことができなくなります。

もう1つの大きな欠点は、@encode文字列に構造体のパディングに関する情報がないことです。あなたは、文字列を解析するときにそれを考慮する必要があります。私はあなたがこれを助けるためにNSGetSizeAndAlignmentを使うことができると思います。

あなたの健全性を危険にさらしたい場合は、“Type Encodings” section of the Objective-C Runtime Programming Guideをお読みください。

私は弾丸を噛んで、GamePreset *を取り、構造レイアウトのハードコードされた知識を使ってNSDictionary *を返す単純な関数を書くことをお勧めします。

+0

文字列としてエンコーディングするのは、 ' - (NSDictionary *)DictionaryFromGamePreset:(GamePreset)NewGamePreset'コマンドを書くのと同じくらい難しいでしょう。 – Itoqixer

関連する問題