• Objective


    前面我们已经讲解完了一些基础知识, 注意事项, 还有一些简单的例子, 那么今天我们来设计一个属于我们自己的类, 要怎么做才设计的合理呢? 下面我们来看看~~


    首先我们得知道要做什么, 比如我要设计一个学生的类, 那么要如何设计呢?


    类名: 学生

    属性: 名字, 性别, 体重, 身高, 生日

    行为(方法): 跑步, 吃东西


    我们来详细分析一下:

    1. 我们知道了学生的属性有五个, 分别是姓名, 性别, 生日, 体重, 身高

    如果按照我们一般的思维来设计的话, 没有经验的人应该会这么写:

    @interface Student : NSObject
    {
        @public
        int year;   //年
        int month;  //月
        int day;    //日
        char *name;  //名字
        double weight;  //体重
        int height;  //身高
        char *sexMan;   //性别男
        char *sexWomen; //性别女
    }
    @end
    


    这样子写的坏处, 一旦创建的对象多了, 那不就要写的累死人了吗? 为了方便, 我们应该把一些固定的东西抽出来做成一个枚举, 把一些相同的类型抽出来做成一个结构体:

    typedef enum
    {
        SexMan,
        SexWomen
    }Sex;
    
    typedef struct
    {
        int year;
        int month;
        int day;
    }Date;
    
    @interface Student : NSObject
    {
        @public
        char *name;  //名字
        double weight;  //体重
        int height;  //身高
        Date birthday;  //生日
        Sex sex;    //性别
    }
    
    - (void)eat;
    - (void)run;
    @end
    

    而且还可以顺便把下面的两个方法给声明, 知道了这些信息之后, 我们就可以继续往下:

    @implementation Student
    
    - (void)eat
    {
        weight += 1;
        NSLog(@"吃完一次之后的体重是:%.2f/kg", weight);
    }
    
    - (void)run
    {
        weight -= 1;
        NSLog(@"运动完一次之后的体重是:%.2f/kg", weight);
    }
    
    @end
    


    方法我们也实现好了, 那么主要就看main()函数里面要怎么去给成员变量赋值了:

    int main()
    {
        Student *xiaoming = [Student new];
        xiaoming->name = "xiaoming";
        xiaoming->sex = SexMan;
        xiaoming->height = 165;
        xiaoming->weight = 55.5;
        
        Date d = {1999, 1, 9};
        xiaoming->birthday = d;
        
        [xiaoming print];
        
        return 0;
    }


    main()函数里面也搞定了之后, 如果我们需要知道学生的信息, 那么我们可以再写一个方法把学生的信息打印出来:

    - (void)print
    {
        NSLog(@"这名学生叫%s, 他的性别是%d, 体重是%.2f/kg, 身高是%d/cm, 生日是%d-%d-%d.", name, sex, weight, height, birthday.year, birthday.month, birthday.day);
    
    }
    

    输出的结果:

    2015-01-14 16:01:13.067 a.out[9033:937651] 这名学生叫xiaoming, 他的性别是0, 体重是55.50/kg, 身高是165/cm, 生日是1999-1-9.
    



    但是, 还有一个问题, 我们这里需要再考虑一个事情, 有些生日的日期是XXXX-XX-X这样子的格式, 如果有这样子的需求, 我们必须得去解决, 该怎么解决呢? 下面我们来看看:

    - (void)print
    {
        if (birthday.month < 10) {
            NSLog(@"这名学生叫%s, 他的性别是%d, 体重是%.2f/kg, 身高是%d/cm, 生日是%d-0%d-%d.", name, sex, weight, height, birthday.year, birthday.month, birthday.day);
        }
        else
        {
            NSLog(@"这名学生叫%s, 他的性别是%d, 体重是%.2f/kg, 身高是%d/cm, 生日是%d-%d-%d.", name, sex, weight, height, birthday.year, birthday.month, birthday.day);
        }
    }
    

    输出的结果:

    2015-01-14 16:02:59.959 a.out[9039:938372] 这名学生叫xiaoming, 他的性别是0, 体重是55.50/kg, 身高是165/cm, 生日是1999-01-9.
    




    看到这里或许有人会疑问, 为什么性别是0呢???  让我们回忆一下枚举类型里面存储的是什么东西, 没错~~~枚举类型里面存的是整型, 默认是从0开始~~~在这里性别男是0, 所以打印出来的结果就是0.




    补充一些知识点:

    在我们实际开发中, 枚举类型最好是以枚举名开头, 比如:

    typedef enum
    {
        SexMan,
        SexWomen
    }Sex;
    

    这样子方便团队合作的时候别人知道对应的是什么枚举类型.


    还有在main()函数里面的结构体赋值, 我之前讲过, 创建好对象的时候不可以再给结构体赋值, 只有再初始化的时候才可以给结构体赋值, 这里我举几个简单的方法解决这个问题:

    1.
        Date d = {1999, 1, 9};
        xiaoming->birthday = d;
    
    2.    
        xiaoming->birthday.year = 1999;
        xiaoming->birthday.month = 1;
        xiaoming->birthday.day = 9;
    
    3.    
        Date d = xiaoming->birthday;
        d.year = 1999;
        d.month = 1;
        d.day = 9;
        xiaoming->birthday = d;
    

    在这里, 哪个简单就使用哪个, 所以推荐使用第一个~~其他两个方法了解就好了~~


    那么最终的效果就是:

    <span style="font-size:12px;">#import <Foundation/Foundation.h>
    
    typedef enum
    {
        SexMan,
        SexWomen
    }Sex;
    
    typedef struct
    {
        int year;
        int month;
        int day;
    }Date;
    
    @interface Student : NSObject
    {
        @public
        char *name;  //名字
        double weight;  //体重
        int height;  //身高
        Date birthday;  //生日
        Sex sex;    //性别
    }
    
    - (void)eat;
    - (void)run;
    @end
    
    @implementation Student
    
    - (void)eat
    {
        weight += 1;
        NSLog(@"吃完一次之后的体重是:%.2f/kg", weight);
    }
    
    - (void)run
    {
        weight -= 1;
        NSLog(@"运动完一次之后的体重是:%.2f/kg", weight);
    }
    
    - (void)print
    {
        if (birthday.month < 10) {
            NSLog(@"这名学生叫%s, 他的性别是%d, 体重是%.2f/kg, 身高是%d/cm, 生日是%d-0%d-%d", name, sex, weight, height, birthday.year, birthday.month, birthday.day);
        }
        else
        {
            NSLog(@"这名学生叫%s, 他的性别是%d, 体重是%.2f/kg, 身高是%d/cm, 生日是%d-%d-%d", name, sex, weight, height, birthday.year, birthday.month, birthday.day);
        }
    }
    
    @end
    
    int main()
    {
        Student *xiaoming = [Student new];
        xiaoming->name = "xiaoming";
        xiaoming->sex = SexMan;
        xiaoming->height = 165;
        xiaoming->weight = 55.5;
        
        Date d = {1999, 1, 9};
        xiaoming->birthday = d;
        
        [xiaoming print];
        
        return 0;
    }</span>






    好了, 这次我们就到这里,  下次我们继续~~~

  • 相关阅读:
    Nodejs定时任务(node-schedule)
    JS数组reduce()方法详解及高级技巧
    JS中的单线程与多线程、事件循环与消息队列、宏任务与微任务
    用 canvas 的 getImageData 做点有趣的事
    高并发问题处理研究:Select for update使用解析:悲观锁与乐观锁、行锁与表锁
    node项目部署正常启动后不能访问的问题
    nodejs获取formdata上传的文件及解析excel问题
    程序员居然还不会搭建一个自己的博客网站?
    10分钟带你搭建属于自己的博客
    HashMap的循环姿势你真的掌握了吗?
  • 原文地址:https://www.cnblogs.com/iOSCain/p/4282860.html
Copyright © 2020-2023  润新知