• OC基础--对成员变量的封装


    #import <Foundation/Foundation.h>
    
    //日期结构体
    typedef struct{
        int year;
        int month;
        int day;
    } Date;
    
    @interface School : NSObject
    {
        //@public
        NSString * _name;
        NSString * _address;
        Date _createTime;
    }
    - (void) introduction;
    @end
    #import "School.h"
    
    @implementation School
    - (void)introduction{
        NSLog(@"学校名称:%@, 学校地址:%@, 创办时间:%i 年 %i月 %i日", [self name], [self address], [self createTime].year, [self createTime].month,[self createTime].day);
    }
    @end
    #import <Foundation/Foundation.h>
    #import "School.h"
    
    int main(int argc, const char * argv[]) {    
         School * s = [School new];
         s->_name = @"科技大学";
         s->_address = @"XX省XX市XX区XX路XX号";
         s->_createTime.year = 2045;
         s->_createTime.month = 13;
         s->_createTime.day = 34;
       
        [s introduction];    
        return 0;
    }

    如果成员变量是public, 给成员变量赋值的时候, 赋予的值不受我们的约束, 在外部可以随便读写  外界有可能赋值一些脏数据

     封装:

      屏蔽内部实现的细节, 仅仅对外提供共有的方法/接口

      好处:保证数据的安全性    将变化隔离

      规范: 将不需要对外提供的内容都隐藏起来,把属性都隐藏,提供公共的方法对其访问

    Getter - Setter方法:

      setter方法:

         作用: 设置成员变量的值

         格式:

           1. setter方法一定是对象方法

           2. 一定没有返回值

           3. 一定以set开头, 并且set后面跟上需要设置的成员变量的名称去掉下划线, 并且首字母大写

           4. 一定有参数, 参数类型一定和需要设置的成员变量的类型一致, 并且参数名称就是成员变量的名称去掉下划线

            //成员变量以下划线开头的好处,就是可以区分局部变量和成员变量
            - (void) setName: (NSString *) name{
               //可在这里添加验证代码对传入的数据做验证
                _name = name;
            } 

       getter方法:

         作用: 获取成员变量的值

         格式:

           1. getter方法一定是对象方法

           2.一定有返回值, 而且返回值一定和获取的成员变量的类型一致

           3.方法名称就是获取的成员变量的名称去掉下划线

           4. 一定没有参数

            - (NSString* ) name{
                return _name;
            } 

         > 一个属性可以只有getter方法, 没有setter方法, 这种属性我们称之为只读属性

         > 一个属性也可以只有setter方法, 没有getter方法, 这种属性我们称之为只写属性

         > 如果既有setter方法又有getter方法, 那么这种属性我们称之为可读可写的属性

         > 一个属性也可以没有getter和setter, 这种属性我们称之为私有属性

      Getter - Setter 方法的调用:   

       Date date = {1990, 1, 1};   
        School * s = [School new]; 
    
        [s setName:@"test"];
        [s setAddress:@"tset"];
        [s setCreateTime:date];    
    
        NSLog(@"学校名:%@", [s name]); 

      点语法:

           > 如果给属性提供了getter和setter方法, 那么访问属性就又多了一种访问方式 , 点语法

           > 点语法其实它的本质就是调用setter和getter方法

           > 点语法是一个编译器的特性, 会在程序翻译成二进制的时候将.语法自动转换为setter和getter方法的调用

           > 如果点语法在=号的左边, 那么编译器会自动转换为setter方法

           > 如果点语法在=号的右边, 或者没有等号, 那么编译器就会自动转换为getter方法  

         s.name = @"test";       // 等效于  [s setName:@"test"];
          s.address = @"测试";     // 等效于  [s setAddress:@"测试"];
          s.createTime = date;    // 等效于  [s setCreateTime:date];   
          NSLog(@"学校名:%@, 学校地址:%@", s.name, s.address);
          // 等效于  NSLog(@"学校名:%@, 学校地址:%@", [s name], [s address]); 

             > 点语法一般用于给成员变量赋值, 如果不是给成员变量赋值一般情况下不建议使用, 但是也可以使用

        - (void)test:(int)num{
            NSLog(@"测试数据 %i", num);
        }
        s.test;   // 等效于  [s test]
    #import <Foundation/Foundation.h>
    //日期结构体
    typedef struct{
        int year;
        int month;
        int day;
    } Date;
    
    @interface School : NSObject
    {
        //@public
        NSString * _name;
        NSString * _address;
        Date _createTime;
    }
    
    -(void) setName: (NSString *) name;
    -(NSString* ) name;
    
    - (void) setAddress: (NSString *) address;
    - (NSString *) address;
    
    - (void) setCreateTime: (Date) date;
    - (Date) createTime;
    
    - (void) introduction;
    
    - (void) test;
    - (void) test: (int) num;
    @end
    
    
    #import "School.h"
    
    @implementation School
    
    -(void) setName: (NSString *) name{
        //可在这里添加验证代码对传入的数据做验证
        _name = name;
    }
    - (NSString* ) name{
        return _name;
    }
    
    - (void) setAddress: (NSString *) address{
        _address = address;
    }
    - (NSString *) address{
        return _address;
    }
    
    - (void) setCreateTime: (Date) date{
        _createTime = date;
    }
    - (Date) createTime{
        return _createTime;
    }
    
    - (void)introduction{
        NSLog(@"学校名称:%@, 学校地址:%@, 创办时间:%i 年 %i月 %i日", [self name], [self address], [self createTime].year, [self createTime].month,[self createTime].day);
    }
    //测试点语法访问非getter-setter方法
    - (void)test{
        NSLog(@"点语法调用无参对象方法");
    }
    - (void)test:(int)num{
        NSLog(@"测试数据 %i", num);
    }
    @end
    
    #import <Foundation/Foundation.h>
    #import "School.h"
    
    int main(int argc, const char * argv[]) {
        
        //School * s = [School new];
    //    s->_name = @"科技大学";
    //    s->_address = @"XX省XX市XX区XX路XX号";
    //    s->_createTime.year = 2045;
    //    s->_createTime.month = 13;
    //    s->_createTime.day = 34;
        
        Date date = {1990, 1, 1};
        School * s = [School new];
        
        s.name = @"test";       // 等效于  [s setName:@"test"];
        s.address = @"测试";     // 等效于  [s setAddress:@"测试"];
        s.createTime = date;    // 等效于  [s setCreateTime:date];
        
        NSLog(@"学校名:%@, 学校地址:%@", s.name, s.address);
        // 等效于  NSLog(@"学校名:%@, 学校地址:%@", [s name], [s address]);
        
        // 点语法调用无参对象方法警告信息: Property access result unused - getters should not be used for side effects
        s.test;         // 等效于  [s test];
        // 点语法调用带参对象方法 编译直接报错
        s.test:111;       
        
        [s introduction];
        
        return 0;
    }
  • 相关阅读:
    HackerRank
    HackerRank
    LeetCode "Kth Smallest Element in a BST"
    HackerRank
    HackerRank
    LeetCode "Roman to Integer"
    LeetCode "Integer to Roman"
    LeetCode "Majority Element II"
    HackerRank
    HackerRank
  • 原文地址:https://www.cnblogs.com/dx-230/p/4770036.html
Copyright © 2020-2023  润新知