Domanda

Ho un protocollo:

@protocol Gadget <NSObject>

@property (readonly) UIView *view;

- (void) attachViewToParent:(UIView *)parentView;

@end
.

E una classe base "Abstract", con un'implementazione (come Getter, non mostrata) di -(UIView *)view:

// Base functionality
@interface AbstractGadget : NSObject {
    UIView *view;
}

@property (readonly) UIView *view;

@end
.

Ma quando implemendo il protocollo Gadget in una sottoclasse di AbstractGadget, come:

// Concrete
@interface BlueGadget : AbstractGadget <Gadget> {
}

- (void) attachViewToParent:(UIView *)parentView;

@end


@implementation BlueGadget

- (void) attachViewToParent:(UIView *)parentView {
    //...
}

@end
.

Ottengo un errore del compilatore che mi dice " Avvertenza: la proprietà 'Visualizza' richiede il metodo '-view' da definire ."Posso farlo andare via usando @dynamic o aggiungere un metodo stub:

- (UIView *) view {
    return [super view];
}
.

Ma voglio solo sapere se sto facendo qualcosa che non è supportato, qualcosa che non dovrei fare, o se è solo una limitazione / bug nel compilatore?

È stato utile?

Soluzione

Dichiarando la proprietà come @dynamic che stai dicendo al compilatore che la proprietà getter (e setter se richiesto) venga implementata altrove (potenzialmente in fase di runtime).Questo suona come un caso di uso perfettamente ragionevole per me.

Vedi I Documenti per ulteriori informazioni.

Altri suggerimenti

Ho anche trovato questo problema esatto.Questa è una delle situazioni che @Dynamic è lì per.

Ecco la regola per variabile, proprietà e sintetizza in Objective-C:

Se hai una proprietà, devi avere un @synthesize o dichiari @dynamic e scrivi il metodo Gettter e Setter da solo.

Quindi, perché hai una proprietà chiamata View, devi dichiarare @synthesize.Questo dovrebbe essereNiente a che fare con @protocollo, ereditarietà

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top