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, 給成員變量賦值的時候, 賦予的值不受咱們的約束, 在外部能夠隨便讀寫  外界有可能賦值一些髒數據安全

 封裝:ide

  屏蔽內部實現的細節, 僅僅對外提供共有的方法/接口測試

  好處:保證數據的安全性    將變化隔離spa

  規範: 將不須要對外提供的內容都隱藏起來,把屬性都隱藏,提供公共的方法對其訪問翻譯

Getter - Setter方法:code

  setter方法:對象

     做用: 設置成員變量的值blog

     格式:接口

       1. setter方法必定是對象方法get

       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;
}
相關文章
相關標籤/搜索