2014-06-11 68 views
0

我見過一位教授使用賦值運算符在C++中這樣說:在Objective-C中擴展賦值運算符的功能?

int valueOne; 
int valueTwo; 
valueOne = valueTwo = 0; 

我想開始做用Objective-C,但在這樣類似的東西:

@interface GameViewController() // Class extension in .m 
@property (nonatomic) NSUInteger pOneScore; 
... 
- (void)resetScore { 
// Update singleton and local variable in one line using assignment operator 
[[MySingleton sharedManager] setPlayerOneScore:pOneScore = 0]; 
… 

..這似乎工作。任何人都可以在這裏看到潛在的危險嗎? 問題的其他部分是:我是否也可以爲對象執行此操作?我認爲在對象的情況下,如果可能的話,我將兩個指針分配到同一個內存位置是這樣的:

@interface GameViewController() // Class extension in .m 
@property (nonatomic, strong) NSNumber *valueOne; 
@property (nonatomic, strong) NSNumber *valueTwo; 
… 
- (void)resetScore { 
// Assign valueOne and valueTwo at the same time; 
_valueOne = _valueTwo = @(0); 
NSLog(@」valueOne = %@ and points to %p」, _valueOne, _valueOne); 
NSLog(@」valueTwo = %@ and points to %p」, _valueTwo, _valueTwo); 
… 

我測試,它似乎是好了,我不知道是否有任何危險這裏。我期待着任何和所有的評論。謝謝

我也想知道如果賦值運算符可以用類似的方式在Java和C#中使用。

+0

我在這裏看到的主要危險是它使你的代碼難以閱讀,沒有任何實際的好處。當您瀏覽代碼時,很容易錯過'setPlayerOneScore:'調用中有一個賦值語句的事實。 – omz

回答

0

是的,這是可能的,並按預期工作。請注意,對於對象,當然,您將始終獲得相同的實例而不是副本!對於NSNumber這可能沒有問題,但可能不適用於其他用例。

即使一些人喜歡使用它,但我通常不會推薦它。這讓下面的兩個任務看起來太相似了:

valueOne = valueTwo = 0; 
valueOne = valueTwo == 0; 

同理:

[[MySingleton sharedManager] setPlayerOneScore:pOneScore = 0]; 
[[MySingleton sharedManager] setPlayerOneScore:pOneScore == 0]; 

==類型的語句是比較常見的,它可以使對方一看就喜歡一個人忘記的人物。這意味着我總是必須驗證作者的真正含義。可以使用相同的機制將作業與if合併,這通常被認爲是相似的混淆。

這就是爲什麼一些現代語言(如斯威夫特)回到這一點,而實際上不允許允許它。

+0

到目前爲止我明白。我很高興你提到了(Swift)。現在,pOneScore == 0,我想會返回一個BOOL。 –

+0

這是有道理的,但事實並非如此。它只會返回'0'或'1',因爲C本來沒有布爾類型。 (Swift會這樣,所以Swift編譯器會指出錯誤。) – nschum

0

個人

​​

看起來有點怪怪的,可能容易出錯的我,但

_valueOne = _valueTwo = @(0); 

看起來不錯。我實際上一直在使用它(爲了節省一些打字費用和IMO,只要你知道你在做什麼就可以做任何事情)。順便說一句,你不需要在@(0)括號 - 只需@0就足夠了。

是的,你可以在Java和C#中做到這一點。

好消息:你爲什麼做這種分配的原因是因爲像a = 0表達式實際返回的值(這是0在這種情況下),所以b = a = 0是相同的b = (a = 0)(因爲賦值運算符是正確的-associative)。

在他們的新語言Swift中,Apple認爲這是一個糟糕的主意,所以在Swift中刪除了該行爲,並且a = 0返回Void(這意味着什麼也不返回),並且您不能在Swift中執行此「串行分配」 。