Objective-C基礎:協議(@protocol)
C++以純虛函數來定義抽象接口,繼承了抽象接口的類必須要實現所有父類的純虛函數。OC中的協議類似於C++的純虛函數。
1.聲明協議。@protocol後面接協議的名稱。
@protocol NSObject
@end
如果一個協議繼承於另外一個協議,聲明方法為尖括號裡面填入父協議名稱。
@protocol SonProtocol<BaseProtocol>
@end
2.類符合某個協議。在類的聲明中用尖括號填入協議名稱。
@interface Car : NSObject <NSCopying>
@end
@interface Car : NSObject <NSCopying, NSCoding>
@end
3.協議方法聲明可以用@optional和@require來表明符合這個協議的類是否必須實現協議裡面的方法。@require為必須,@optional為可選。這點與C++不一樣,
C++必須實現所有純虛接口。
@protocol WorkerProtocol <NSObject>
@optional
- (void)doSomeOptionalWork;
@required
- (void)doSomeRequiredWork;
@end
上面代碼表明符合WorkerProtocol協議的類必須實現doSomeRequiredWork,而doSomeOptionalWork為可選。
4.可以在方法參數和實例變量裡面明確地指出對象必須符合某協議。
@interface Manager : NSObject
@property (weak) id <WorkerProtocol> delegate;
- (void)doWork;
@end
上面的代碼表明delegate必須符合WorkerProtocol協議。如果不符合,編譯器會警告。如下代碼編譯器會警告Assigning to 'id<WorkerProtocol>' from incompatible type 'NSString *__strong'
NSString* name = @"akon";
manager.delegate = name;
[manager doWork];