簡體   English   中英

在Objective-C中更新具有只讀屬性的類

[英]Updating a class with readonly properties in Objective-C

用只讀屬性創建和更新類的好模式是什么? 這樣一個類的例子

@interface ReadOnlyClass : NSObject

@property (nonatomic, assign, readonly) NSUInteger number;

@end

類用戶沒有必要調用init構造函數(盡管在Objective-C中實際上不可能避免)或其他任何事情。 蘋果在CMLogItemCLLocation中使用此模式。 那么,如何才能很好地更改/更新number的值?

我相信最適合要求的模式是構建器模式。

EG:您擁有只讀屬性,即結果,然后計算一些函數。 您可以在內部設置各種參數,例如

-(void) setMathExpression:(NSString) aExpression;
-(void) calculate;

然后,用戶可以設置一個表達式,調用calculate,然后從readonly屬性中獲取結果。

如果我理解您的觀點正確,那么number是計算所得的屬性,或者-更好的說法是-取決於屬性。 number的值取決於其他可以更改的屬性。 正確?

通常,您只需為此寫一個顯式的setter:

-(NSUInteger)number
{
  return /* your calculation */;
}

例如:您具有另一個屬性playerName並且想要返回字符數。 (好的,不是很退出,但是我需要一個例子。)

-(NSUInteger)number
{
  return [self.playerName length];
}

請注意:由於您覆蓋了為只讀屬性聲明的所有方法,因此不會合成任何ivar。

如果計算成本很高,或者到目前為止,與可變屬性( playerName )的setter相比,getter的執行頻率更高,那么可以每次將類中的屬性更改為讀寫屬性並設置值都是一種優化可變屬性已更改。

@interface ReadOnlyClass ()
@property (readwrite, …) NSUInteger number;
…
@end

// number is synthesized in this case
-(void)setPlayerName:(NSString*)playerName
{
   _playerName  = playerName;
   self.number = [playerName length];
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM