プロパティの呼び出し方法を工夫する【ライトサイドObjective-C】


通常、プロパティは以下の形式(self.name – プロパティ呼び出し・プロパティアクセス)で呼び出すことが多いと思います。

-(void)test {
  NSString *name = self.name;
  self.name = @"bob";
}

@property (nonatomic) NSString *name;

ただし、プロパティのセッターやゲッターをオーバーライドして特殊な処理を加えているような場合、例えば遅延初期化や動的な戻り値を返すような改良を加えている場合は、あえてメッセージ呼び出し式([self name])で呼び出すようにすると良いです。

-(void)test {
  NSString *lazy = [self lazy];
  NSString *name = [self name];
  [self setName:@"bob"];
}

@property (nonatomic) NSString *lazy;
@property (nonatomic) NSString *name;

// 遅延初期化
-(NSString*)lazy { return _lazy ?: (_lazy = @"Lazy"); }
// 動的なメソッド(値が空の場合はデフォルト値を返す)
-(NSString*)name { return _name ?: @"Default"; }
// 特殊なセッター(二回目のセット処理を無効化する)
-(void)setName:(NSString*)name { _name = _name ?: name; }

こうすることで、呼び出しているプロパティが動的なプロパティや特殊なプロパティであることを読み手に示唆することが出来ます。チーム開発では比較的有効なコーディング規約になるかと思います。

まとめ

固定的な戻り値が期待されるプロパティーでは通常通りのプロパティー呼び出し(ary.count)を行うようにし、動的なプロパティーに関してはメッセージ呼び出し([ary count])を行ないましょう。

NSArray *ary = @{};
ary.count;   // Good!!
NSMutableArray *ary = @{}.mutableCopy;
[ary count]; // Good!!

[ary count]という記述はあまり今風の記述ではなく、抵抗があるかもしれません。確かに、単純な用途であれば、従来通りary.countでも構わないでしょう。

NSMutableArray *ary = @{}.mutableCopy;
NSMutableArray *bry = [NSMutableArray arrayWithCapacity:ary.count];

ただし以下の様に、プロパティーの参照結果が処理中に動的に変化するようなケースでは、メッセージ呼び出し式による区別を付けておいたほうが良いです。

NSMutableArray *ary = @{}.mutableCopy;
while ([ary count] > 9)
  [ary removeLastObject];

こうすることで、countプロパティーの結果が動的なものであることをより視覚的・直感的な形で表現出来るようになります。

余談

若干話題が変わりますが、プロパティをオーバーライドするケースでは、Xcodeの定義位置へのジャンプ機能(^⌘J)はプロパティ呼び出し時よりもメッセージ呼び出し時のほうが正確に機能することが多いです。プロパティ呼び出し箇所でジャンプ機能を利用すると、ヘッダー側@property NSString *name;にジャンプしてしまうことが多いのですが、メッセージ式に対してジャンプ機能を用いれば、きちんとプロパティのオーバーライド箇所-(NSString*)name {}にジャンプします。

プロパティのセッターやゲッターをオーバーライドした際には、メッセージ形式で呼び出しを行うような癖を付けておくのも良いかもしれません。

広告

関連するオススメの記事