有時,可能會發現希望通過新增僅在某些情況下有用的行為來擴充套件現有類。 要向現有類新增此類擴充套件,Objective-C提供了類別和擴充套件。
如果需要向現有類新增方法,或許為了新增功能以便在應用程式中更容易地執行某些操作,最簡單的方法是使用類別。
宣告類別的語法使用@interface
關鍵字,就像標準的Objective-C類描述一樣,但不表示子類的任何繼承。在括號中指定類別的名稱,如下所示 -
@interface ClassName (CategoryName)
@end
即使沒有原始實現原始碼,也可以為任何類宣告類別。在類別中宣告的任何方法都可用於原始類的所有範例,以及原始類的任何子類。
在執行時,類別新增的方法與原始類實現的方法之間沒有區別。
現在,來看一個類別實現的範例。在Cocoa類NSString
中新增一個類別。此類別將使可以新增一個新方法getCopyRightString
,它返回版權字串。 如下所示 -
#import <Foundation/Foundation.h>
@interface NSString(MyAdditions)
+(NSString *)getCopyRightString;
@end
@implementation NSString(MyAdditions)
+(NSString *)getCopyRightString {
return @"Copyright y ii bai.com 2019";
}
@end
int main(int argc, const char * argv[]) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
NSString *copyrightString = [NSString getCopyRightString];
NSLog(@"Accessing Category: %@",copyrightString);
[pool drain];
return 0;
}
執行上面範例程式碼,得到以下結果:
2018-11-16 02:45:34.949 main[131207] Accessing Category: Copyright y ii bai.com 2019
即使類別新增的任何方法都可用於類及其子類的所有範例,仍需要在任何原始碼檔案中匯入類別標頭檔案,否則將遇到編譯器警告和錯誤。
在上面範例中,由於只有一個類,因此沒有包含任何標頭檔案,在這種情況下應該包含如上所述的標頭檔案。