我有一個名爲MyProtocol的協議。 MyProtocol有一個所需的方法:使類與現有方法的類別一致
- (NSUInteger)length;
和其他一些方法。
現在我想讓NSString類符合MyProtocol的類別。像這樣:
@interface NSString (NSStringWithMyProtocol) <MyProtocol>
@end
在這一類我實現不包括「長度」方法的所有方法,因爲我要原來的NSString實現。 我不想在這個特定的類中重寫它。
現在我收到警告,因爲該類別中MyProtocol的不完整實現。
我知道有幾個解決方案來解決這個問題。
- 使該方法可選
- 指針混寫
- 添加子類類,這是符合協議。然後忽略執行。
我不想使用這些選項,因爲它們會導致我的代碼其餘部分設計不好。
選項3不好,因爲現有的直接子類將不符合該協議。
有沒有人知道如何在不實施長度方法的情況下刪除警告?
注意:類,類別和協議只是例子。我確實遇到了這個問題,我無法發佈其他課程。 謝謝
編輯:增加了第三個選項。
全碼:
協議:
@protocol MyProtocol <NSObject>
- (void) myMethod;
- (NSInteger) length;
@end
類別標頭:
#import <Foundation/Foundation.h>
#import "MyProtocol.h"
@interface NSString (MyProtocol) <MyProtocol>
@end
類別執行:
@implementation NSString (MyProtocol)
- (void)myMethod {
}
@end
這會導致以下警告。
Incomplete implementation
Method in protocol not implemented
在這個截圖可以看到我的警告:
我試着用LLVM GCC 4.2和蘋果LLVM編譯器3.0編譯。 我也在xcode 4.0.2和Xcode 4.2上編譯。 我在OS X 10.6.8上。
我加了我的代碼。我也看到最新的不同。您沒有爲類別定義實現。 –
Clang顯然比gcc更嚴格。在絕大多數情況下,這是件好事,但在這種情況下,我相信你已經將它推到當前實現的邊緣。我會打開對叮噹的缺陷。 –
我想我會將此標記爲正確答案。請注意,它只會在類已經實現了協議中定義的所有方法時才起作用。通過部分實現協議,類別實現不能存在。 –