コメントの1つにMindaugasが述べたように、この目的のためにクラス拡張を使用できます。
クラス拡張は、クラス自体の実装内で使用するための追加のプライベートメソッドまたはプロパティを使用してパブリックインターフェイスを拡張するためによく使用されます。
は、例えば の.hは
@interface Person : NSObject
@property(nonatomic, copy) NSString *firstName;
@property(nonatomic, copy) NSString *lastName;
- (void)setDateOfBirth:(NSDate *)date;
@end
.Mは
@interface Person()
@property(nonatomic, strong) NSDate *dateOfBirth;
- (void)calculateMyAge;
@end
@implementation Person
- (void)setDateOfBirth:(NSDate *)date
{
self.dateOfBirth = date;
//Some more code goes here
}
- (void)calculateMyAge
{
//Do something with self.dateOfBirth here
}
@end
は、ここでは、
@property
dateOfBirthのとインタフェース人にプライベートメソッドcalculateMyAgeを作り、
@implementation
ブロックの下でそれを実現していますが含まれています。
@interface Person()
は、クラス拡張(または名前のないカテゴリまたは匿名カテゴリ)以外は何もありません。
ここで元の質問に戻って、それをあなたのフレームワークに公開し、外部のために公開したいと考えています。
Personクラスに完全な名前(姓と名が追加された)を返すようにしたいとしましょう。しかし、あなたはフレームワークの内部目的にしたい。
このために別のヘッダーファイルを作成することができます。あなたのPerson.m
ファイルに
#import "Person+InternalHeader.h"
をインポートすることができますし、@implementation
ブロックの下であなたは方法のために身体を実装することができます方法
@interface Person()
- (NSString *)fullName;
@end
のための宣言を持っています
Person+InternalHeader.h
。
@implementation Person
//other code
- (NSString *)fullName
{
return [self.firstName stringByAppendingFormat:@" %@",self.lastName];
}
@end
いつでもPerson + InternalHeader.hを他のクラスにインポートしてfullNameメソッドを使用できます。
なぜ拡張子ではないのですか?
拡張機能を使用すると、プロパティを上書きしたり、既存の親クラスに新しいプロパティを追加したりすることができます。また、子クラスでは、拡張で定義されたメソッドのデフォルト動作を常にオーバーライドできます。カテゴリを使用すると、既存のオブジェクトにメソッドが追加されます。
たとえば、クラスPersonから継承するDoctorクラスがあるとします。
@interface Doctor : Person
ここで、fullName
メソッドが "Dr."プリペンド。 Doctor.m
ファイルのfullName
動作を上書きするだけで済みます。
@implementation Doctor
- (NSString *)fullName
{
NSString *fullName = [super fullName];
return [@"Dr. " stringByAppendingString:fullName];
}
@end
私は両方の言語(Objective-c、Swift)でカスタムフレームワークを開発しました。これは、独自のメソッドに対して異なるスコープ(公開、プライベート、保護)を行うことができないという事実です。 –
エクステンションを使用できると思います。ここのようなものhttp://stackoverflow.com/questions/19095716/hiding-properties-from-public-framework-headers-but-leaving-available-internall – Mindaugas
はい、拡張機能が動作します。 –