6

私は最近 ruby​​ を学んでおり、Objective C で遅延ゲッターをより簡単に記述できるようになる ||= 機能が大好きです。

現在、次のようなゲッターを作成しています。

- (NSArray *)myArray {
  if (!_myArray) {
    _myArray = [NSArray array];
  }
  return _myArray
}

||= で何かが欠けていない限り、Ruby で前のコードを次のように記述できます。

- (NSArray *)myArray {
  return _myArray ||= [NSArray array];
}

それは明らかにはるかにきれいです。Objective-C 言語/ランタイムでこれを可能にするものはありますか?

また、以下はゲッターの 1 行の 3 項です。上記の実証済みの真の方法 (最初のスニペット) と同じくらい効果的かどうかはわかりません。何か問題があるかどうか誰かに教えてもらえますか:

- (NSArray *)myArray {
  return _myArray = _myArray ? _myArray : [NSArray array];
}
4

2 に答える 2

11

最後のスニペットは、最初に投稿したものと同じ効果があります。

改善点として、||=Objective-C のような演算子はありませんが、3 項の if 演算子の 2 番目のパラメーターを省略して do

return _myArray = _myArray ?: [NSArray array];

これは正確に

return _myArray = _myArray ? _myArray : [NSArray array];

これは、 gccclangの両方の最新バージョンでサポートされている言語拡張です。

ボーナス:さらにキーストロークを節約したい場合は、次のことができます

- (NSArray *)myArray {
    return _myArray = _myArray ?: @[];
}

補足として、中間オペランドをスキップすることにも利点があります。

たとえば、この場合

id x = [self someMethod] ? [self someMethod] : [self anotherMethod];

someMethod評価された場合trueは2回呼び出されますが、

id x = [self someMethod] ?: [self anotherMethod];

一度だけ呼び出されます。

于 2013-10-26T03:22:40.870 に答える