ObjectiveC基础——对象作为方法的参数连续传递

一、对象和方法的关系
1.对象可以作为方法的参数
小明用iPad 迷你看电影
代码实现:

#import <Foundation/Foundation.h>

@interface Ipad : NSObject
{
    @public
    NSString *_typeNum;
}
@end

@implementation Ipad

@end

@interface Person : NSObject
{
    @public
    NSString *_name;
}
-(void)seeMovie:(Ipad *) ipad;
@end

@implementation Person

-(void)seeMovie:(Ipad *)ipad{
    NSLog(@"%@用%@看电影",_name,ipad->_typeNum);
}

@end

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        Ipad *i = [Ipad new];
        Person *p = [Person new];
        i->_typeNum = @"Ipad Mini";
        p->_name = @"小明";
        [p seeMovie:i]; //小明用Ipad Mini看电影
    }
    return 0;
}

2.对象可以作为方法的返回值
母鸡下蛋
代码实现:

#import <Foundation/Foundation.h>

@interface Egg : NSObject
{
    @public
    float _weight;
}
@end

@implementation Egg

@end

@interface Hen : NSObject
{
    @public
    NSString *_name;
}
-(Egg *)lay:(float)weight;
@end

@implementation Hen

-(Egg *)lay:(float)weight{
    Egg *e = [Egg new];
    e->_weight = weight;
    return e;
}

@end

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        Hen *hen = [Hen new];
        hen->_name = @"Tim";
        Egg *egg = [hen lay:20.50f];
        NSLog(@"母鸡%@下了一个%.2fg的蛋",hen->_name,egg->_weight);
        //母鸡Tim下了一个20.50g的蛋
    }
    return 0;
}

二、对象最为方法的参数连续传递
具体问题:士兵用枪射击。
士兵类:
属性:年龄、姓名
方法:开枪
枪类:
属性:型号
方法:射击
弹夹类:
属性:子弹口径,子弹数量

代码:

#import <Foundation/Foundation.h>

#pragma mark 弹夹类
@interface BulletBox:NSObject
{
    @public
    NSString *_size;
    int _bulletCount;
}
@end

@implementation BulletBox
@end


#pragma mark 枪类
@interface Gun:NSObject
{
    @public
    NSString *_size;
}
-(void) shoot:(BulletBox *)bulletbox;
@end

@implementation Gun
-(void) shoot:(BulletBox *)bulletbox{
    if(bulletbox->_bulletCount>0){
        bulletbox->_bulletCount--;
        NSLog(@"\n开枪射击,嘭...(枪的型号:%@,子弹口径:%@,剩余子弹:%d)",_size,bulletbox->_size,bulletbox->_bulletCount);
    }else{
        NSLog(@"\n没有子弹了,请更换弹夹!!");
    }
}
@end


#pragma mark 士兵类
@interface Soldier:NSObject
{
    @public
    NSString *_name;
    int _life;
}
-(void) fire:(Gun *)gun and:(BulletBox *)bulletbox;
@end

@implementation Soldier
-(void) fire:(Gun *)gun and:(BulletBox *)bulletbox{
    [gun shoot:bulletbox];
}
@end

#pragma mark -
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        //实例化弹夹
        BulletBox *bulletbox = [BulletBox new];
        bulletbox->_size = @"0.5mm";
        bulletbox->_bulletCount = 5;

        //实例化枪
        Gun *gun = [Gun new];
        gun->_size = @"AK47";

        //实例化士兵
        Soldier *soldier = [Soldier new];
        soldier->_name = @"卫龙";
        soldier->_life = 100;
        //连开7枪
        [soldier fire:gun and:bulletbox];
        [soldier fire:gun and:bulletbox];
        [soldier fire:gun and:bulletbox];
        [soldier fire:gun and:bulletbox];
        [soldier fire:gun and:bulletbox];
        [soldier fire:gun and:bulletbox];
        [soldier fire:gun and:bulletbox];


    }
    return 0;
}

运行结果:
开枪射击,嘭…(枪的型号:AK47,子弹口径:0.5mm,剩余子弹:4)
开枪射击,嘭…(枪的型号:AK47,子弹口径:0.5mm,剩余子弹:3)
开枪射击,嘭…(枪的型号:AK47,子弹口径:0.5mm,剩余子弹:2)
开枪射击,嘭…(枪的型号:AK47,子弹口径:0.5mm,剩余子弹:1)
开枪射击,嘭…(枪的型号:AK47,子弹口径:0.5mm,剩余子弹:0)
没有子弹了,请更换弹夹!!
没有子弹了,请更换弹夹!!

分析:弹夹类作为参数首先通过枪类的shot方法传入,然后再通过士兵类的fire方法传入士兵类。弹夹类对象作为函数的参数实现了连续传递。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值