web-dev-qa-db-ja.com

読み取り専用ですが、プライベートセッターを持つObjective-Cプロパティ

@property構文を使用して、パブリックに読み取り専用であるが、クラス内からプライベートに呼び出すことができるセッターを持つ合成プロパティを宣言したいと思います。

Objective-Cであるため、これは基本的にsetFoo:メソッドが合成されることを意味しますが、クラス自体の外部で呼び出すと警告(認識されないセレクター)が発生します。警告をトリガーするには、プロパティreadonly;を宣言する必要があります。クラス内でのみ利用可能な合成セッターを強制する方法はありますか?

63
Adam Ernst

あなたが探しているものはクラス拡張と呼ばれると思います。ヘッダーでプロパティを読み取り専用として宣言します。

@interface MyClass : NSObject {
}

@property (readonly, assign) NSInteger myInteger;

@end

次に、実装ファイルでクラス拡張を再宣言します。

@interface MyClass ()

@property (readwrite, assign) NSInteger myInteger;

@end


@implementation MyClass

@end

詳細については、Appleの ドキュメント をご覧ください

102
Sean Rich

私は遅れる可能性がありますが、拡張子なしで私は次のテクニックを使用しました

@interface MyClass : NSObject {
 NSString * name;
}

@property (readonly, strong) NSString * name;

@end

一方、実装ファイルでは

@implementation MyClass
 @synthesize name;

 - (id)initWithItems:(NSDictionary *)items {
self = [super init];
if(self)
{ 
  name = @"abc";
}

return self;
}

@end

そうすることで、値が設定され、読み取り専用としてアクセス可能になります。ありがとう。

1
Majid Bashir