溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

協(xié)議protocol和代理delegate的使用

發(fā)布時間:2020-07-07 05:49:09 來源:網(wǎng)絡(luò) 閱讀:605 作者:Im劉亞芳 欄目:開發(fā)技術(shù)

這里的協(xié)議是獨立的,不再類里面,所以每個類的頭文件都要引入#import "MarryProtoco.h"頭文件。。

首先新建一個協(xié)議 Protocol:MarryProtoco 里面寫代理人要執(zhí)行的方法,或者可選方法

#import <Foundation/Foundation.h>
@protocol MarryProtoco <NSObject>
//代理人中必須要執(zhí)行的 。
//做飯
- (void)cook;
//洗衣服
- (void)washCloth;
//看孩子
- (void)lookAfterChild;
//代理人中可選執(zhí)行的
@optional
//交朋友
- (void)makeFriend;
@end


然后在新建一個老大類,老大類就這讓代理人執(zhí)行方法的類--這里新建的是Boy類

Boy.h文件代碼

#import <Foundation/Foundation.h>
#import "MarryProtoco.h"   //Boy引入?yún)f(xié)議
@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;   //代理人是在老大里面設(shè)置的
//- (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類型的寫法。應(yīng)該改成注釋后的寫法
{
    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

創(chuàng)建代理類Girl,來執(zhí)行協(xié)議中的方法

Gril.h文件代碼

#import <Foundation/Foundation.h>
#import "MarryProtoco.h"   //Gril引入?yún)f(xié)議
@interface Girl : NSObject<MarryProtoco>
{
    NSString *_name;
   
}
@property (nonatomic , copy)NSString *name;
- (instancetype)initWithName:(NSString *)name;
//代理人必須執(zhí)行協(xié)議里面的全部方法即MarryProtoco里面的方法
//代理人中@optional里面的方法是可選的,可以執(zhí)行也可以不執(zhí)行。
- (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主函數(shù)中的代碼寫法

#import <Foundation/Foundation.h>
#import "Girl.h"
#import "Boy.h"
#import "MarryProtoco.h"
int main(int argc, const char * argv[])
{
    @autoreleasepool {
        /*
         凡事符合系統(tǒng)默認(rèn)setter、getter書寫格式的方法,都可以使用點語法
         例如:[person setName:@“zhangsan”];
         可以等價寫成 person.name = @“zhangsan”;
         
         NSString *name = [person name];
         可以等價寫成NSString *name = person.name;
         屬性是一對getter、setterfangfa,點語法是屬性的另一種調(diào)用格式       
         */
        
//        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]; //設(shè)置代理人,
        [gg work];
        [gg play];
        [gg eat];
        
        //每次只能存在一個代理人,如果想換代理人,就必須讓現(xiàn)有的死了,然后在設(shè)置代理人
    }
    return 0;
}




向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI