2011-08-31 18 views
11

我有一個名爲MyProtocol的協議。 MyProtocol有一個所需的方法:使類與現有方法的類別一致

- (NSUInteger)length; 

和其他一些方法。

現在我想讓NSString類符合MyProtocol的類別。像這樣:

@interface NSString (NSStringWithMyProtocol) <MyProtocol> 
@end 

在這一類我實現不包括「長度」方法的所有方法,因爲我要原來的NSString實現。 我不想在這個特定的類中重寫它。

現在我收到警告,因爲該類別中MyProtocol的不完整實現。

我知道有幾個解決方案來解決這個問題。

  1. 使該方法可選
  2. 指針混寫
  3. 添加子類類,這是符合協議。然後忽略執行。

我不想使用這些選項,因爲它們會導致我的代碼其餘部分設計不好。
選項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 

在這個截圖可以看到我的警告: Screen shot

我試着用LLVM GCC 4.2和蘋果LLVM編譯器3.0編譯。 我也在xcode 4.0.2和Xcode 4.2上編譯。 我在OS X 10.6.8上。

回答

7

我不能再現此問題。你可以發佈代碼來演示它嗎?以下編譯10.7時沒有警告。

#import <Foundation/Foundation.h> 

@protocol MyProtocol <NSObject> 
- (NSUInteger)length; 
@end 

@interface NSString (NSStringWithMyProtocol) <MyProtocol> 
@end 

int main (int argc, const char * argv[]) { 
    @autoreleasepool { 
    id<MyProtocol> foo = @"foo"; 
    NSLog(@"%@", foo);  
    } 
    return 0; 
} 
+1

我加了我的代碼。我也看到最新的不同。您沒有爲類別定義實現。 –

+1

Clang顯然比gcc更嚴格。在絕大多數情況下,這是件好事,但在這種情況下,我相信你已經將它推到當前實現的邊緣。我會打開對叮噹的缺陷。 –

+1

我想我會將此標記爲正確答案。請注意,它只會在類已經實現了協議中定義的所有方法時才起作用。通過部分實現協議,類別實現不能存在。 –

0

你可能會認爲這是一個黑客攻擊的一位,我不知道如果它甚至會工作,但如何對聲明爲只讀屬性

@property (readonly, assign) NSUInteger length; 

,然後在執行你的類別,使它@dynamic

+1

應該爲吸氣劑,但不適用於二傳手。沒有指出這只是一個例子。無法談論我的生產代碼。 –

+0

@Mats:使其成爲讀/寫屬性,然後 – JeremyP

+1

正確。但這不僅會解決setter/getter方法。正如我以前的評論所指出的那樣,我處理其他類和方法。 –

相關問題