protocol简单用法

使用:delegate 和datasource
    指定具体做某事,
    类中定义
        @property (nonatomic,weak) id<UISomeObjectDelegate> delegate;
        @property (nonatomic,weak) id<UISomeObjectDataSource> dataSource;

    这样,你就可以在实现该类的地方(类C)指定delegate,当然类C也是实现该的协议,这样就可以指定: instance.delegate = self;

    当某种条件下,delegate会调用其中的一些方法,类C当然重写了这些方法。

用法2.dataSource uiview中,例如uiTable
    对它指定特定协议的数据源,uiTable只要调用它的数据源的某些方法去获取数据,因为ui是不拥有数据的,getContentAt:(int)row;

用法3. Animation

    实现某些元件,比如UIView是 animatable,这样就可以对他设置动画了,具体就是调用对应动画的函数


main.m

//

#import <Foundation/Foundation.h>
#import "Person.h"
#import "School.h"


int main(int argc, const char * argv[]) {
    @autoreleasepool {
        
        // 定义协议在运行时与 单个id时没区别多,只是为了在编译时更好而已
        
//        NSString *defaultName = @"wuyr";
        // 方式1 obj PersonProtocol协议类型
//        id <PersonProtocol> obj = [[Person alloc] init];
//        if (![obj getName]) {
//            [obj setName:defaultName];
//        }
//        NSLog(@"name: %@",[obj getName]);
        
        Person *per1 = [[Person alloc] init];
        [per1 setName:@"per1"];
        
        Person *per2 = [[Person alloc] init];
        [per2 setName: @"per2"];
        
        School *school = [[School alloc] init];
        [school addStudent:per1];// 方式2 定义对应协议的参数,其实就是相当于as3或者java里的接口
        [school addStudent:per2];
        
        NSLog(@"students: %@", [school getStudentNames]);
        
    }
    return 0;
}

person.h

#import <Foundation/Foundation.h>



@protocol PersonProtocol <NSObject>
// 如果你实现了PersonProtocol协议,你必须还要实现<>中的必须实现的方法,可以同时拥有多个父协议

@property (readonly) NSString *name;

-(void) setAge:(int) aAge;
-(void) setName:(NSString *)aName;
-(NSString *)getName;

@optional

-(int) setHeight:(float) height;

@end
//-----------------------------

@interface Person : NSObject <PersonProtocol>

@end

person.m

#import "Person.h"




@implementation Person

@synthesize name;

-(void)setAge:(int)aAge{
    
}

-(void)setName:(NSString *)aName{
    name = aName;
}

-(NSString *)getName{
    return name;
}

@end

school.h

#import <Foundation/Foundation.h>
#import "Person.h"

@interface School : NSObject

-(void) addStudent:(id<PersonProtocol>) student;

-(NSMutableArray*)getStudentNames;

@end



school.m

#import "School.h"

@interface School(){
    NSMutableArray *students;
}
@end

@implementation School

-(void)addStudent:(id<PersonProtocol>)student{
    if (!students) {
        students = [NSMutableArray array];
    }
    [students addObject:student];
}

-(NSMutableArray *)getStudentNames{
    NSMutableArray *arr = [NSMutableArray array];
    id <PersonProtocol> student;
    for (student in students) {
        [arr addObject:[student getName]];
    }
    return arr;
}

@end


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值