2012-03-12 11 views
7

Sto tentando di dichiarare un privato @interface per una categoria, nel file .m.È possibile dichiarare una seconda interfaccia @ per una categoria?

Per una classe normale che vorrei fare:

@interface ClassA() 

@end 

@implementation ClassA 

@end 

e sarebbe lavorare senza problemi.

Per una classe con le categorie ho provato:

@interface ClassA (CategoryA)() 

@end 

@implementation ClassA (CategoryA) 

@end 

ma sta dando ogni sorta di diversi errori. Sto cercando di "estendere" una categoria, il modo in cui una classe viene estesa tramite questa sintassi @interface ClassA().

Voglio avere metodi privati ​​per la categoria, e volevo sapere se, IN AGGIUNTA all'interfaccia esposta, ho il permesso di inserire una seconda categoria @interface nel file .m, che non espone variabili e metodi di istanza fuori dalla classe stessa.

Qualcosa di simile a questo:

ClasseA + categoryA.h

@interface ClassA (CategoryA) 

<some public methods> 

@end 

ClasseA + categoryA.m il file

@interface ClassA (CategoryA) 

<some private methods> 

@end 


@implementation ClassA (CategoryA) 

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

@end 

In questo momento questo mi sta dando un avvertimento in Xcode:

Duplica definizione di categoria "Cate" goryA 'on interface' ClassA '

C'è un modo per ottenere questo comportamento?

+1

Qual è la ragione per -1? Ho fatto qualche errore? –

+0

Kinda vague, avresti dovuto fornire gli errori di cui stavi parlando. Ma penso sia abbastanza chiaro per una risposta. – fbernardo

+2

Gli errori non sono rilevanti qui, sono chiaramente dovuti a xCode che non capisce la sintassi che sto tentando di applicare. –

risposta

12

No, non è possibile dichiarare due interfacce per una singola categoria. Puoi fare una delle due cose:

Englebert + Humperdinck.h

#import "Englebert.h" 

@interface Englebert (Humperdinck) 

- (void) croon; 

@end 

È possibile dichiarare un'altra categoria con un nome diverso per contenere i metodi privati. Questi possono poi essere utilizzati nello stesso file in cui viene dichiarata l'interfaccia categoria privato:

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 

L'altra opzione è quella di semplicemente non dichiarare i metodi privati. Se li definisci nel blocco di implementazione, puoi utilizzarli in qualsiasi punto del file dopo che sono stati definiti (e per l'ultima versione di Xcode/LLVM, l'ordine è in realtà irrilevante - i metodi non dichiarati possono essere utilizzati ovunque il file in cui sono definiti). Nessun altro file sarà in grado di vedere questi metodi.

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

Grazie mille Josh. Molto ben spiegato Non sapevo con l'ultimo Xcode che l'ordine di implementazione non era più importante, andrò da questa parte. Saluti. –

+0

Prego! –

+0

Salve dichiaro la seconda categoria nel file di implementazione della prima categoria (proprio come hai mostrato qui). Ma non ho scritto un @implementation per la seconda categoria, li ho appena implementati nell'implementazione di prima categoria. Xcode non si è lamentato, quindi è un'opzione "migliore"? B/C il mio obiettivo qui è quello di dichiarare quei metodi privati ​​e posso risparmiare un po 'di digitazione. – Qiulang

1

fare

@interface ClassA (CategoryA) 

@end 

@implementation ClassA (CategoryA) 

@end 

invece. Le categorie non possono avere varibles di istanza. E che tipo di errori stai parlando?

0

@interface ClassA() è un anonymous category ed è possibile utilizzarli come interfacce e definire l'implementazione nell'implementazione ClassA. @interface ClassA (CategoryA)() è un errore di sintassi e dovrebbe leggere @interface ClassA (CategoryA)

EDIT:

Per creare i metodi privati ​​per una classe, in quella classe .m file che si avrebbe:

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

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

Lo stesso può essere fatto per categorie nominate, tuttavia è necessario definire separatamente l'implementazione per evitare avvisi. Anche in questo caso, nel file .m:

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

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

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

Questa è esattamente la mia domanda, non una risposta. Sto chiedendo se posso implementare alcuni metodi "privati" e variabili di istanza che non sono esposte esternamente dalla classe stessa come facciamo per le classi senza categorie. So come scrivere un'interfaccia per la mia categoria di classe ma che è esposta all'esterno, mi chiedo se c'è una sintassi per evitare di esporre i metodi all'esterno anche per categorie di classi con nome. –

+0

vedere il mio aggiornamento ... –

+0

Questo commento non ha senso. Puoi avere metodi "privati" per la tua classe dichiarando l'interfaccia() nel tuo file di implementazione. È possibile creare categorie su istanze/classi specifiche utilizzabili da qualsiasi classe. Cos'altro ti serve? – Rog

Problemi correlati