OC中传入参数,返回多值

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OC中传入参数,返回多值相关的知识,希望对你有一定的参考价值。

看看先:

    // 日期格式化对象
    NSDateFormatter *fmt = [[NSDateFormatter alloc] init];
    // 设置日期格式
    fmt.dateFormat = @"yyyy-MM-dd HH:mm:ss";
    
    // 2个日期对象
    NSDate *date1 = [fmt dateFromString:@"1970-01-01 00:00:01"];
    NSDate *date2 = [fmt dateFromString:@"1970-02-02 01:01:00"];
    
    // 从date1到date2之间走过的秒数
    NSInteger interval = [date2 timeIntervalSinceDate:date1];
    
    // 1分钟 = 60秒
    NSInteger secondsPerMinute = 60;
    
    // 1小时 = 60 * 60秒 = 3600秒
    NSInteger secondsPerHour = 60 * secondsPerMinute;
    
    // 1天 = 24 * 60  * 60秒
    NSInteger secondsPerDay = 24 * secondsPerHour;
    
    NSInteger day = interval / secondsPerDay;
    NSInteger hour = (interval % secondsPerDay) / secondsPerHour;
    NSInteger minute = ((interval % secondsPerDay) % secondsPerHour) / secondsPerMinute;
    NSInteger second = interval % secondsPerMinute;
    
    NSLog(@"%zd天%zd小时%zd分%zd秒", day, hour, minute, second);

能否将这段代码封装起来,传入一日期对象,返回天,小时,分钟,秒 ?

有几种常见的方法?

推荐使用哪种?

1.指针 

指针知识回顾:

int age = 10;

int *p ;

p = &age;

//将100赋值给指针变量p所指向的存储空间 相当于 age = 100
*p = 100;

 因此在方法的实现中:

 *dayP = interval / secondsPerDay;
 *hourP = (interval % secondsPerDay) / secondsPerHour;
 *minuteP = ((interval % secondsPerDay) % secondsPerHour) / secondsPerMinute;
 *secondP = interval % secondsPerMinute;

 在方法的调用中:

 NSInteger day = 0;
    NSInteger hour = 0;
    NSInteger minute = 0;
    NSInteger second = 0;
    
    [date2 zlf_intervalSinceDate:date1 day:&day hour:&hour minute:&minute second:&second];
    
    NSLog(@"%zd天%zd小时%zd分%zd秒", day, hour, minute, second);

 但是这种传入的参数太多,能否只传入日期,返回天,小时,分钟,秒 ?

2.集合  (通过集合装着返回的数据, 但只能装对象)

2.1数组

实现:

   NSInteger day = interval / secondsPerDay;
   NSInteger hour = (interval % secondsPerDay) / secondsPerHour;
   NSInteger minute = ((interval % secondsPerDay) % secondsPerHour) / secondsPerMinute;
   NSInteger  second = interval % secondsPerMinute;

   return @[@(day), @(hour), @(minute), @(second)];

 调用:

        NSArray *interval = [date2 zlf_intervalSinceDate:date1];

        NSInteger day = [interval[0] integerValue];

        NSInteger hour = [interval[1] integerValue];

        NSInteger minute = [interval[2] integerValue];

        NSInteger second = [interval[3] integerValue];

 

        NSLog(@"%zd天%zd小时%zd分%zd秒", day, hour, minute, second);

 这样调用起来很不友好,乃至调用的时候压根不知道0,1,2,3代表的含义。必须进入到实现文件中查看。

因此可以和枚举一起使用,这样调用起来稍微好些。

定义枚举

typedef enum {
    /** 天 */
    ZLFIntervalIndexDay = 0,
    /** 小时 */
    ZLFIntervalIndexHour = 1,
    /** 分钟 */
    ZLFIntervalIndexMinute = 2,
    /** 秒 */
    ZLFIntervalIndexSecond = 3,
} ZLFIntervalIndex;

 

 这样调用起来(至少有提示,知道数组中每个对象的含义):

 NSArray *interval = [date2 zlf_intervalSinceDate:date1];
    
        NSInteger day = [interval[ZLFIntervalIndexDay] integerValue];
        NSInteger hour = [interval[ZLFIntervalIndexHour] integerValue];
        NSInteger minute = [interval[ZLFIntervalIndexMinute] integerValue];
        NSInteger second = [interval[ZLFIntervalIndexSecond] integerValue];
    
        NSLog(@"%zd天%zd小时%zd分%zd秒", day, hour, minute, second);

 

以上是关于OC中传入参数,返回多值的主要内容,如果未能解决你的问题,请参考以下文章

Go_17:GoLang中如何使用多参数属性传参

Lua_函数_可变参数

在android中动态创建选项卡并使用传入的参数加载片段

多值参数

s-s-rS 多值参数只返回最后一个值

Swift 学习- 07 -- 函数