2012-03-12 7 views
7

私は、.mファイルのカテゴリに対してプライベート@interfaceを宣言しようとしています。カテゴリに対して2番目の@interfaceを宣言できますか?

私はどうしたら通常のクラスの場合:

@interface ClassA() 

@end 

@implementation ClassA 

@end 

、それがスムーズに働くだろう。

@interface ClassA (CategoryA)() 

@end 

@implementation ClassA (CategoryA) 

@end 

をしかし、それは別のエラーのすべての並べ替えを与えている:私が試したカテゴリを持つクラスの場合

。私はカテゴリを拡張しようとしています。つまり、この構文でクラスを拡張する方法は、@interface ClassA()です。

カテゴリのプライベートメソッドが必要です。公開されたインターフェイスの追加で、インスタンス変数とメソッドを公開しない.mファイルに@interfaceという2番目のカテゴリを入れることが許可されているかどうかを知りたかったのです。クラスそのものの外にある。このような

何か:

にClassA + categoryA.h

@interface ClassA (CategoryA) 

<some public methods> 

@end 

にClassA + categoryA.m

@interface ClassA (CategoryA) 

<some private methods> 

@end 


@implementation ClassA (CategoryA) 

<here I want to be able to call the private methods above> 

@end 

をファイルには、今のところ、これは私のXcodeで警告を与えている。

カテゴリ 'Cateの重複定義goryA 'on interface' ClassA '

この現象を起こす方法はありますか?

+1

-1の理由は何ですか?間違いをしましたか? –

+0

曖昧なことに、あなたが話していたエラーを提供したはずです。しかし、私は答えが十分に明確だと思います。 – fbernardo

+2

エラーはここでは関係ありません。明らかに、私が適用しようとしている構文をxCodeが理解していないためです。 –

答えて

12

いいえ、あなたは、単一のカテゴリーのための2つのインターフェイスを宣言することはできません。次の2つのうちのいずれかを実行できます。

Englebert + Humperdinck時間

#import "Englebert.h" 

@interface Englebert (Humperdinck) 

- (void) croon; 

@end 

あなたはプライベートメソッドを含むように別の名前でカテゴリを宣言することができます。これらは、その後、民間のカテゴリインターフェイスが宣言されている同じファイルで使用することができます

Englebert + Humperdinck.m

#import "Englebert+Humperdinck.h" 

@interface Englebert (HumperdinckPrivate) 

- (void) warmUp; 

@end 

@implementation Englebert (HumperdinckPrivate) 

- (void)warmUp { 
    NSLog(@"Warm up"); 
} 

@end 

@implementation Englebert (Humperdinck) 

- (void)croon { 
    [self warmUp]; 
    NSLog(@"Croon"); 
    // etc. 
} 

@end 

他のオプションは、単にプライベートメソッドを宣言しないことです。実装ブロックで定義した場合は、定義されたファイルの任意の場所で使用できます(Xcode/LLVMの最新バージョンでは、その順序は実際には重要ではありません)。宣言されていないメソッドは、それらが定義されているファイル)。他のファイルはこれらの方法を見ることができません。

Englebert + Humperdinck.m

#import "Englebert+Humperdinck.h" 

@implementation Englebert (Humperdinck) 

/* Undeclared private method */ 
- (void)warmUp { 
    NSLog(@"Warm up"); 
} 

- (void)croon { 
    [self warmUp]; 
    NSLog(@"Croon"); 
    // etc. 
} 

@end 
+0

ありがとう、ジョシュ。非常によく説明されています。私は最新のXcodeで実装の順序はもう重要ではなかったことを知らなかった、私はこの方法を行くだろう。乾杯。 –

+0

あなたは大歓迎です! –

+0

こんにちは、最初のカテゴリの実装ファイルに2番目のカテゴリを宣言します(ここで示したように)。しかし、私は第2のカテゴリーに対して@implementationを書いていませんでした。最初のカテゴリーの実装で実装しました。 Xcodeはそれについて不平を言っていないので、それは "より良い"オプションですか? B/C私の目標は、これらのプライベートメソッドを宣言することです。私はいくつかの型を保存することができます。 – Qiulang

1

は、代わりに

@interface ClassA (CategoryA) 

@end 

@implementation ClassA (CategoryA) 

@end 

います。カテゴリはインスタンス変数を持つことはできません。そして、あなたはどんな誤りを言っていますか?

0

@interface ClassA()anonymous categoryであり、これをインターフェイスとして使用して、ClassA実装で実装を定義することもできます。 @interface ClassA (CategoryA)()は構文エラーであると読むべき@interface ClassA (CategoryA)

EDIT:

.mファイルそのクラスで、クラスのプライベートメソッドを作成するには、必要があります:

同じのために行うことができます
@interface ClassA() 
    // Private functions declared 
@end 

@implementation ClassA 
    // Private functions defined 
    // Other functions defined 
@end 

ただし、警告を避けるために実装を個別に定義する必要があります。ここでも、.mファイルに:

@interface ClassA (hidden) 
    // Private functions declared 
@end 

@implementation ClassA (hidden) 
    // Private functions declared 
@end 

@implementation ClassA 
    // Other functions defined 
@end 
+0

それはまさに私の質問ですが、答えはありません。私はいくつかの "プライベート"メソッドとインスタンス変数を実装することができるかどうかを尋ねています。これらのメソッドは、クラスを持たないクラスに対して外部的に公開されません。私は自分のクラスカテゴリのインターフェイスを書く方法を知っていますが、それは外部に公開されています。名前付きクラスカテゴリの外部にもメソッドを公開しないようにする構文があるのだろうかと思います。 –

+0

私の更新を見て... –

+0

このコメントは意味をなさない。インプリメンテーションファイルにinterface()を宣言することで、クラスにプライベートなメソッドを持たせることができます。任意のクラスから使用可能な特定のインスタンス/クラスにカテゴリを作成できます。他に何か要りますか? – Rog

関連する問題