2011-04-28 67 views
0

我有一個協議是這樣的:界定條件

@protocol ProfileSubObjects <NSObject, NSCoding> 
@required 
- (BOOL) hasGraph; 

@optional 
- (NSArray *) xGraphValues; 
- (NSArray *) yGraphValues; 

我要讓這需要兩個可選的方法,如果hasGraph等於YES。 這可能嗎?

+1

你想用這個做什麼? – Jano 2011-04-28 15:12:30

回答

1

編號方法是協議要求的,或者它們不是。首先,-hasGraph的值在編譯時不知道。由於它是一種實例方法而不是類方法,因此在創建特定對象之前甚至不會在運行時知道它。此外,對象可能會在不同的時間報告不同的-hasGraph值。

這裏要做的最好的事情就是簡單地記錄一下這樣的事實:如果-hasGraph返回YES,-xGraphValues和-yGraphValues預計會實現。你可以通過拋出一個異常來強制執行,或者如果這些方法沒有被實現,你可能會失敗並且不會繪製任何數據。在調用它之前,使用-respondsToSelector:方法檢查該方法是否已實現。

0

這是不可能的; hasGraph的結果只有在運行時纔會被知道,而協議的必需/可選部分用於編譯器在編譯時檢查事情。

你可能想要做的就是添加一個強調,如果hasGraph返回YES,那麼必須實現xGraphValues和yGraphValues,從而爲您的正式協議帶來一點非正式性。你總是可以這樣做:

if([object respondsToSelector:@selector(xGraphValues)] && 
    [object respondsToSelector:@selector(yGraphValues)]) 

要驗證在運行時對象是否實現,你需要爲了能夠做到就可以了具體的操作協議的部分。如果你想讓一個實現了不符合對象的人能夠通過調試構建找出他們做錯了什麼,那麼把這些東西放在NSAssert中可能會很明智。

1

不,這是不可能的。至少,不是這樣的。但是有一個更深的問題。這個問題建議考慮編譯與運行時檢查和麪向對象。

將某些內容標記爲@optional或@required意味着您希望執行編譯時檢查這些對象是否履行了爲這些方法提供實現的協議合約(或不是@optional)。

因此沒有理由讓編譯時間檢查依賴於運行時變量的值,在本例中爲hasGraph。

更好的方法是使用respondsToSelector消息檢查。或者,您可以擁有一個具有圖形並提供x和y圖形值的子類。