2013-12-23 15 views
3

我對我所做的類有一個類別,並且該類別符合協議,該協議在其實現中需要屬性。但是,由於我屬於某個類別,因此我無法在執行類別時綜合該屬性。正因爲如此,我難以理解如何實現setter方法(當我只保留協議的屬性時,它可以正常工作,因爲我需要的只是訪問方法)。iOS類別符合具有以下屬性的協議:如何實現

這是我的協議:

@protocol SomeProtocol <NSObject> 
@property (nonatomic) BOOL didDisplayRecommendation; 
@end 

我知道如果我這樣做,我會得到一個無限循環:

- (void)setDidDisplayRecommendation:(BOOL)didDisplayRecommendation 
{ 
    self.didDisplayRecommendation = didDisplayRecommendation; 
} 

但當我嘗試這個,我得到一個編譯錯誤:

- (void)setDidDisplayRecommendation:(BOOL)didDisplayRecommendation 
{ 
    _didDisplayRecommendation = didDisplayRecommendation; 
} 

請注意,didDisplayRecommendation是協議中的屬性。解決這個問題的最好方法是什麼?提前致謝!

+0

[Objective-C的類別和新的伊娃(的可能重複http://stackoverflow.com/questions/10502539/ objective-c-category-and-new-ivar) –

+0

不是重複的,不涉及符合協議的問題 – Mason

+0

您可以在具有(at)屬性的類別中添加「特殊」屬性(nonatomic,retain) MyClass * anObject - 但是在實現文件中,您可以做的只是動態anObject,然後可以使用關聯引用cfunction來僞裝其他對象來代替該屬性。它的工作原理並不是解決方法,您可以在商業應用程序中執行此操作,也可以通過執行協議檢查。 – unmircea

回答

2

你不允許實例變量添加到各個類別一類,見https://stackoverflow.com/a/13000930/171933

既然你需要一個變量來保存的didDisplayRecommendation的價值,你出與類別這樣的運氣(除非你想變髒https://developer.apple.com/library/mac/documentation/Cocoa/Reference/ObjCRuntimeRef/Reference/reference.html#//apple_ref/doc/uid/TP40001418-CH3g-SW5)。

我建議重新考慮你的架構,看看你是否真的需要使用類別。子類或甚至Mixins可能是更好的方法。

+0

您可以在(at)屬性(非原子,保留)MyClass * anObject的類別中添加「特殊」屬性 - 但是在實現文件中,您只能在動態anObject上執行,然後可以使用關聯引用cfunction以僞裝其他物品來代替該物業。它的工作原理並不是解決方法,您可以在商業應用程序中執行此操作,也可以通過執行協議檢查。 – unmircea

+0

@unmircea是的,這絕對**技術上可能**。不過,我認爲你應該有一個非常有說服力的理由訴諸聯想參考。 –

0

當你在一個協議中添加屬性時,你需要@synthesize它們。

+4

這不適用於Objective-C *類別*。 –

0

我有,讓您在類別申報「屬性」這樣的宏:

@implementation NSObject (AwesomeUtils) 

JESynthesize(assign, NSInteger, index, setIndex); 
JESynthesize(strong, NSString *, name, setName); 
JESynthesize(copy, void(^)(void), completion, setCompletion); 
JESynthesize(unsafe_unretained, id, unsafeObject, setUnsafeObject); 
JESynthesize(weak, id<UITableViewDelegate>, delegate, setDelegate); 
JESynthesize(strong, NSString *, readonlyID, changeReadonlyID); 

// … 
@end 

我說「性」加上引號,因爲你甚至可以不@property聲明中使用它們。該宏也適用於支持weak

你可以在這裏檢查的實施(頭文件是在底部): http://nspicks.com/2013/12/15/cleaner-properties-implementation-in-categories/