0

これは観察と質問です。

一部のjsonデータをクラスにロードしています(jsonはすでにNSDictionaryに変換されています)。値は外部から読み取り専用になります。

@interface Checklist
-(id)initWithJSON:(NSDictionary *)json;
-(NSInteger)checklist_id;
-(NSString *)checklist_name;
etc....
@end

.m ファイル内の対応するメソッド本体。

テストとして、別のデータ要素のクラスを作成しました。

@interface ChecklistItem
-(id)initWithJSON:(NSDictionary *)json;
@property (readonly) NSInteger item_id;
@property (readonly) NSString *item_name;
@end

機能的には、2 つのクラスは @implementation で同様のメソッドを持っています。どちらの場合も、基本的に json から適切な値を取得し、結果を返します。プログラムの残りの部分に関する限り、2 つのアプローチは互換性があるようです。

だから私の質問は:

どのアプローチを使用するのが最適ですか?

どちらの方法でも同じように読みやすいことがわかりましたが、これまでのところ、一方の方法を他方よりも優先するコードの理由を見つけることができません。2番目のオプションは、jsonをドキュメント化するので、良いと思います。

4

5 に答える 5

3
-(NSInteger)checklist_id;
-(NSString *)checklist_name;

これは標準のObjective-Cの命名ではありません。適切に処理したい場合は、プラットフォームの規則に従ってください。Appleは、これをコーディングガイドラインのドキュメントに記載しています。

どのアプローチを使用するのが最適ですか?

Objective-Cに関する限り、これらは同等です。プロパティ構文は、手動でメソッドを作成するよりも高いレベルで意図を表現するため、そのアプローチをお勧めします。また、コードも少なくなります。

于 2013-03-14T20:24:41.817 に答える
3

プロパティを使用する必要があります。KVOを使用すると便利です。

また、パブリックな readonly プロパティを定義し、同じクラスでのみ使用できる readwrite プロパティを使用して、クラス拡張でそれらを上書きすることもできます。似たようなことを達成しようとすると、プライベート ヘルパー メソッドを処理する必要があります — コードは見苦しくなります。

于 2013-03-14T20:34:12.777 に答える
0

これは主観的な質問であり、意見しか返されませんが、これが私のものです。

読み取り専用プロパティは、getter を書き込むだけです。プライベート読み取り書き込みを .m ファイルまたはどこにでも適切に記述せず、ivar を直接設定するだけでは、キー呼び出しの will/did 変更値を取得することさえできず、それらも自分で呼び出す必要があります。

@interface ChecklistItem ()
    @property (readwrite) NSInteger item_id;
    @property (readwrite) NSString *item_name;
@end

オブジェクト内で KVO 準拠にアクセスするには、次の手順を実行する必要があります。

self.item_id = 13;

そしてそうではありません:

_item_id = 13;

もちろん、getter メソッドを使用することもできます。

-(NSInteger)checklist_id;
-(NSString *)checklist_name;

KVO メソッドですべての変更をラップするだけです。

[self willChangeValueForKey:@"checklist_id"];
_item_id = 13;
[self didChangeValueForKey:@"checklist_id"];

それは単なるコーディング スタイルの選択であり、コンパイラが作成する内容を利用する場合もあります。ただし、どちらのオプションも同じように機能します。

于 2013-03-15T01:00:32.390 に答える
0

ARC がセッター内で管理されていたメモリをクリーンアップするようになったため、これはそれほど重要ではありませんが、これは依然として非常にベスト プラクティスです。セッター メソッドを呼び出すパフォーマンス オーバーヘッドも、常にセッターを経由することで得られる安全性に比べれば無視できます。

于 2013-03-14T21:36:55.740 に答える
-1

値が読み取り専用の場合は、値を設定できる可能性があるという混乱を避けるために、読み取り専用のプロパティとしてではなく、メソッドとして使用することをお勧めします。もちろん、サブスクライバーがプロパティにアクセスするためにドット表記を使用できるようにしたい場合を除きますが、NSDictionaryで値を返すだけの場合は、別のコピーを保持しないため、メソッド形式の方が適しています。データ。

于 2013-03-14T20:27:43.063 に答える