是否可以在目标 C 中 getter 的延迟实例化中使用三元运算符



假设我有一个名为 deck of class Deck 的属性,

    @property (strong, nonatomic) Deck *deck;

我可以懒惰地实例化它,如下所示,

    - (Deck *)deck{
      if(!_deck) _deck = [[Deck alloc] init];
      return _deck;
    }

但是,是否可以使用 C 三元运算符延迟实例化它,如下所示?

    - (Deck *)deck{
     return _deck ? _deck:[[Deck alloc] init];  
    }

我实际上更喜欢您的初始版本,因为它易于阅读。

如果你想花哨并编写更少的代码,你可以使用带有省略操作数的条件,这是一个 GCC 扩展也被叮叮当当理解:

- (Deck *)deck{
    return _deck ? : (_deck = [[Deck alloc] init]);
}

_deck仅评估一次,并且仅在nil时才分配给 。

你可以这样做

- (Deck *)deck {
     _deck = _deck ? _deck : [[Deck alloc] init];
     return _deck;
}

如果你使用你提议的懒惰getter,除非在其他地方完成,否则_deck永远不会被设置......也就是说,您从未在第二种方法中实际设置_deck。相反,您每次都会得到一个新的Deck

最新更新