合成存取方法 @synthesize

範例程式
  1. #import "Fraction.h"

  2. @implementation Fraction
  3. {
  4.     int numerator;
  5.     int denominator;
  6. }

  7. -(void) print
  8. {
  9.     NSLog(@"%i/%i", numerator, denominator);
  10. }

  11. -(void) setNumerator:(int)n     // setter方法
  12. {
  13.     numerator = n;
  14. }

  15. -(void) setDenominator:(int)d
  16. {
  17.     denominator = d;
  18. }

  19. -(int) numerator     // getter 方法
  20. {
  21.     return numerator;
  22. }

  23. -(int) denominator
  24. {
  25.     return denominator;
  26. }

  27. -(double) convertToNum
  28. {
  29.     if (denominator != 0)
  30.         return (double) numerator / denominator;
  31.     else
  32.         return NAN;

  33. }
  34. @end


合成存取方法

在 Objc 2.0,您可以讓 setter 和 getter 這兩個方法自動產生。
 ( 一般稱之為存取方法 ( accessor method ) ) 
現在才提及這個,是因為自己能寫出這些方法對於程式設計師是非常重要的。
既然 Objc 2.0 提供這樣方便的功能,那我們就要好好善用這項優點。

首先先介紹 @property 指令識別屬性(properies)。這些屬性通常是實體變數。
例如,在Fraction 類別裡,實體變數 numerator 與 denominator 就屬於這類。
以下介面區段新增了@property指令:
  1. @interface Fraction : NSObject

  2. @property int numerator, denominator;

  3. -(void)    print;
  4. -(double)    converToNum;

  5. @end
請注意,我們不必載入 getter 和 setter 方法的定義:numerator、denominator、setNumerator :、setDenominator : ,而是讓 Objc 編譯器自動為我們產生 ( generate ) 或合成 ( synthesize )。只要在實作區段使用 @synthesize 指令就可以了,如下:
  1. #import "Fraction.h"
  2. @implementation Fraction
  3. @synthesize number, denominator;
  4. -(void) print
  5. {
  6.     NSLog (@"%i / %i ", numerator, denominator);
  7. }
  8. // 使用@synthesize 後,可省略 setter 和 getter 方法
  9. -(double) converToNum
  10. {
  11.    if (denominator != 0)
  12.       return ( double ) numerator / denominator;
  13.    else
  14.       return NAN;
  15. }
  16. @end

留言

這個網誌中的熱門文章

[GoPro] 副檔名 LRV 和 THM 到底是什麼?

[Mac] 資料夾半透明無法開啟

[Git] Git rename from index.lock to index failed.