1

私のプロジェクトでは、カスタム SDK からデータ オブジェクト (XYZCustomClass) が渡されます。このオブジェクトを変更する必要はありません。使用するだけで、そのデータを UI に表示できます。このカスタム データ オブジェクトには、5 つの通常の文字列プロパティと、「addditionalProperties」と呼ばれる NSDictionary タイプのプロパティがあります。ディクショナリには、一連のキーと値のペアが含まれています。

クライアント部分で必要なのは、それらのキーに一致するカスタム データ オブジェクトに実際のプロパティを持たせることです。基本的に、私はすべてが実際のプロパティである素敵なインターフェースを持ちたいと思っています。キーの下にいくつかのものを隠したくありませんが、他のものは通常どおりアクセスできます。

このデータ オブジェクトに、1) 各キーの読み取り専用パブリック プロパティを宣言するカテゴリを作成したいと考えています。2) 特定のプロパティに関連する特定のキーのオブジェクトを取得するゲッターを実装します。

4.6.3 Xcode に取り組んでいます。ベース SDK は 5.0 です。私のアプローチは大丈夫ですか?それはうまくいきますか?

それらは読み取り専用であるため、関連するオブジェクトの提案は行わないでください。

4

3 に答える 3

0

これは目に見える問題なく動作します。このコードに問題はありますか?

データ オブジェクト

#import <Foundation/Foundation.h>

@interface CustomDataObject : NSObject

@property (strong, nonatomic) NSString *name;
@property (strong, nonatomic) NSDictionary *additionalProperties;

@end

 #import "CustomDataObject.h"

 @implementation CustomDataObject

- (id)init
{
    self = [super init];
    if (self)
    {
        self.name = @"FirstName LastName";

        self.additionalProperties = @{@"amount"   : @"1000",
                                      @"state"    : @"happy"};
    }
    return self;
}

@end

カテゴリー

#import "CustomDataObject.h"

@interface CustomDataObject (additionalProperties)

@property (assign, nonatomic, readonly) NSString *amount;
@property (assign, nonatomic, readonly) NSString *state;

@end

#import "CustomDataObject+additionalProperties.h"

@implementation CustomDataObject (additionalProperties)

-(NSString *)amount
{
    return [self.additionalProperties objectForKey:@"amount"];
}

-(NSString *)state
{
    return [self.additionalProperties objectForKey:@"state"];
}

@end

VIEWCONTROLLER と出力

CustomDataObject *myObject = [[CustomDataObject alloc] init];

NSLog(@"%@", myObject.name);
NSLog(@"%@", myObject.amount);
NSLog(@"%@", myObject.state);

-----

2013-07-25 15:44:01.790 CatTest[30911:c07] FirstName LastName
2013-07-25 15:44:03.487 CatTest[30911:c07] 1000
2013-07-25 15:44:03.984 CatTest[30911:c07] happy
于 2013-07-25T14:51:04.780 に答える
0

いいえ、カテゴリでプロパティを宣言することはできません。ただし、回避策を使用できます。プロパティが読み取り専用でない場合は、アクセサー メソッドのように機能するメソッドを追加できます。

例えば。

//getter
-(obj *)readVal{

return self._obj;
}

//setter
-(void) update :(obj *)_val{
self._obj=_val;
}

連想参照を使用できます。Apple のドキュメントからの引用「オブジェクトに連想参照を追加するなどして、このランタイム システムと直接やり取りすることが可能です。クラス拡張とは異なり、関連付けられた参照は元のクラスの宣言と実装に影響を与えません。つまり、フレームワーク クラスで使用できます。元のソース コードにアクセスできないためです。」.

説明については、このSOの回答を参照してください

于 2013-07-25T14:03:02.163 に答える
0

次のように、カテゴリの .h ファイルでメソッドを単純に宣言すると、DOT シュガー構文を取得できます。

@interface CustomDataObject (additionalProperties)

-(NSString *)amount;

@end

その後、次のことができます。

NSLog(@"%@", myObject.amount);

辞書内にある可能性のあるすべての要素に対してメソッドを宣言したくない場合は、次のようにすることができます。

@interface CustomDataObject (additionalProperties)

-(NSString *)additionalPropertiesKey:(NSString *)key;

@end

ただし、この場合、メソッドはパラメーターを必要とするため、DOT 構文が失われます。

于 2013-07-25T15:34:22.377 に答える