您好,登錄后才能下訂單哦!
這里的協議是獨立的,不再類里面,所以每個類的頭文件都要引入#import "MarryProtoco.h"頭文件。。
首先新建一個協議 Protocol:MarryProtoco 里面寫代理人要執行的方法,或者可選方法
#import <Foundation/Foundation.h> @protocol MarryProtoco <NSObject> //代理人中必須要執行的 。 //做飯 - (void)cook; //洗衣服 - (void)washCloth; //看孩子 - (void)lookAfterChild; //代理人中可選執行的 @optional //交朋友 - (void)makeFriend; @end
然后在新建一個老大類,老大類就這讓代理人執行方法的類--這里新建的是Boy類
Boy.h文件代碼
#import <Foundation/Foundation.h> #import "MarryProtoco.h" //Boy引入協議 @interface Boy : NSObject { NSString *_name; // id<MarryProtoco> _delegate; } @property (nonatomic , copy)NSString *name; @property (nonatomic , assign)id<MarryProtoco> delegate;//這里因為是id類型的,所以用assign,并且這里只能上面id<MarryProtoco> _delegate;同時存在一者,否則會報錯。 - (instancetype)initWithName:(NSString *)name; //代理人是在老大里面設置的 //- (void)setDelegate:(id<MarryProtoco>)delegate; - (void)work; - (void)eat; - (void)play; @end
Boy.m文件代碼
#import "Boy.h" @implementation Boy @synthesize name = _name; - (instancetype)initWithName:(NSString *)name // 這里這樣寫是不對的,因為在.h中name是copy類型,如果這樣寫話是assign類型的寫法。應該改成注釋后的寫法 { self = [super init]; if (self) { //_name = name; [self setName:name]; //這個才是copy類型變量的寫法。。。。可懂? } return self; } - (void)setDelegate:(id<MarryProtoco>)delegate { _delegate = delegate; } - (void)work { NSLog(@"%@我要去工作了,早點在家做飯,", _name); [_delegate cook]; } - (void)eat { NSLog(@"%@,我要出去吃飯了,你在家給我好好看孩子", _name); [_delegate lookAfterChild]; } - (void)play { NSLog(@"%@,我要出去玩耍,這些衣服臟了,怎么辦?",_name); [_delegate washCloth]; } @end
創建代理類Girl,來執行協議中的方法
Gril.h文件代碼
#import <Foundation/Foundation.h> #import "MarryProtoco.h" //Gril引入協議 @interface Girl : NSObject<MarryProtoco> { NSString *_name; } @property (nonatomic , copy)NSString *name; - (instancetype)initWithName:(NSString *)name; //代理人必須執行協議里面的全部方法即MarryProtoco里面的方法 //代理人中@optional里面的方法是可選的,可以執行也可以不執行。 - (void)cook; - (void)lookAfterChild; - (void)washCloth; @end
Gril.m文件代碼
#import "Girl.h" @implementation Girl @synthesize name = _name; - (instancetype)initWithName:(NSString *)name { self = [super init]; if (self) { //_name = name; [self setName:name]; } return self; } - (void)cook { NSLog(@"%@我去給您做飯,你別急,馬上好", _name); } - (void)lookAfterChild { NSLog(@"%@說,好睇,我去看孩子,你去玩吧,玩得開心哦。", _name); } - (void)washCloth { NSLog(@"%@說,恩恩,您衣服臟了,我去給你洗洗,嘻嘻,",_name); } @end
main.m主函數中的代碼寫法
#import <Foundation/Foundation.h> #import "Girl.h" #import "Boy.h" #import "MarryProtoco.h" int main(int argc, const char * argv[]) { @autoreleasepool { /* 凡事符合系統默認setter、getter書寫格式的方法,都可以使用點語法 例如:[person setName:@“zhangsan”]; 可以等價寫成 person.name = @“zhangsan”; NSString *name = [person name]; 可以等價寫成NSString *name = person.name; 屬性是一對getter、setterfangfa,點語法是屬性的另一種調用格式 */ // Girl *mm = [[Girl alloc] initWithName:@"妹妹"]; Girl *mm = [[Girl alloc] init]; mm.name = @"妹妹"; // Boy *gg = [[Boy alloc] initWithName:@"哥哥"]; Boy *gg = [[Boy alloc] init]; gg.name = @"哥哥"; [gg setDelegate:mm]; //設置代理人, [gg work]; [gg play]; [gg eat]; //每次只能存在一個代理人,如果想換代理人,就必須讓現有的死了,然后在設置代理人 } return 0; }
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。