首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> C 語言入門

Objective-C 教程 3:類別擴展、類別延展與協定機制深度解析

     編輯:C 語言入門

三大語言特性概覽

特性關鍵字核心用途可見性
類別@interface Class (Name)為現有類別新增方法 (無法新增實例變數)公開
延展@interface Class ()宣告私有方法/屬性/實例變數 (匿名類別)私有 (.m 內)
協定@protocol Name定義方法契約,供類別遵循實作、委託/代理使用公開

類別

核心限制

  • ✅ 可新增實例方法、類別方法
  • ✅ 可新增屬性 (但無法自動合成實例變數,需關聯物件)
  • ❌ 不可新增實例變數 (佈局已固定)
  • ❌ 不可覆寫現有方法 (行為未定義,若需覆寫請用子類別)

實戰:為 NSString 新增驗證方法

// NSString+Validation.h
@interface NSString (Validation)
- (BOOL)isValidEmail;
- (BOOL)isValidPhoneNumber;
@end

// NSString+Validation.m
@implementation NSString (Validation)
- (BOOL)isValidEmail {
    NSString *regex = @"[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}";
    NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex];
    return [pred evaluateWithObject:self];
}
- (BOOL)isValidPhoneNumber {
    // 實作...
    return YES;
}
@end

// 使用
NSString *email = @"test@example.com";
if ([email isValidEmail]) { /* ... */ }

命名慣例

  • 檔案名:ClassName+CategoryName.h/m
  • 類別名:ClassName (CategoryName)
  • 常見分類:Foundation (基礎擴充)、UI (介面相關)、Internal (內部私有)

延展

特性

  • 匿名類別:@interface ClassName ()
  • 通常寫在 .m 檔案頂部 (編譯後不會外露)
  • 可宣告私有方法、私有屬性、實例變數 (現代 Runtime 支援)
  • 實作仍在主 @implementation 區塊

實戰:Student 類別隱藏作弊方法

// Student.h (公開介面)
@interface Student : NSObject
@property (nonatomic, strong) NSString *name;
- (void)study;
@end

// Student.m (私有實作細節)
@interface Student ()
- (void)cheat; // 私有方法宣告
@property (nonatomic, assign) NSUInteger cheatCount; // 私有屬性
@end

@implementation Student
- (void)study { NSLog(@"正經讀書"); }
- (void)cheat { 
    _cheatCount++;
    NSLog(@"偷偷作弊 %lu 次", _cheatCount); 
}
@end

協定

定義語法

@protocol NetworkDelegate 
// 必須實作
@required
- (void)requestDidFinish:(NSData *)data;
- (void)requestDidFail:(NSError *)error;

// 可選實作
@optional
- (void)requestDidProgress:(float)progress;
- (BOOL)shouldCacheResponse:(NSURLResponse *)response;
@end

遵循協定

// 介面宣告
@interface NetworkManager : NSObject
@property (nonatomic, weak) id delegate;
@end

// 實作者
@interface MyController : UIViewController 
@end

@implementation MyController
- (void)requestDidFinish:(NSData *)data { /* 必須實作 */ }
- (void)requestDidProgress:(float)progress { /* 可選實作 */ }
// 未實作 requestDidFail → 編譯警告
@end

協定作為型別約束

// 方法參數限制
- (void)processData:(id)processor;

// 屬性限制
@property (nonatomic, strong) id dataModel;

三者協作實戰:網路層架構

// 1. 協定定義契約
@protocol HTTPClientDelegate 
- (void)client:(id)client didReceiveResponse:(id)response;
- (void)client:(id)client didFailWithError:(NSError *)error;
@end

// 2. 延展隱藏內部狀態
@interface HTTPClient ()
@property (strong) NSURLSession *session;
@property (strong) NSMutableDictionary *pendingRequests;
- (void)handleResponse:(NSURLResponse *)response forRequestID:(NSString *)id;
@end

// 3. 類別擴充便利方法
@interface HTTPClient (Convenience)
- (void)GET:(NSString *)url parameters:(NSDictionary *)params completion:(void(^)(id, NSError*))block;
- (void)POST:(NSString *)url body:(id)body completion:(void(^)(id, NSError*))block;
@end

最佳實踐總結

  1. 公開 API:放在 .h 主介面
  2. 私有細節:放在 .m 延展
  3. 跨類別擴充:用類別,命名規範 Class+Feature
  4. 定義契約:用協定,繼承 NSObject、善用 @optional
  5. 協定組合:id 表達多重契約

結語

類別、延展、協定構成 Objective-C 模組化與封裝的鐵三角。類別解決「無法修改源碼時擴充功能」,延展解決「實作細節隱藏」,協定解決「跨類別契約定義」。三者配合使用,能打造出介面清晰、實作隱藏、擴充彈性的專業級程式碼架構。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved