Objective-C中赋值运算符的拉伸功能? 我看到我的一位教授用C++的赋值操作符这样: int valueOne; int valueTwo; valueOne = valueTwo = 0; @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]; …

Objective-C中赋值运算符的拉伸功能? 我看到我的一位教授用C++的赋值操作符这样: int valueOne; int valueTwo; valueOne = valueTwo = 0; @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]; …,objective-c,Objective C,我想在Objective-C中开始做类似的事情,但方式如下: int valueOne; int valueTwo; valueOne = valueTwo = 0; @interface GameViewController () // Class extension in .m @property (nonatomic) NSUInteger pOneScore; ... - (void)resetScore { // Update singleton and local variable

我想在Objective-C中开始做类似的事情,但方式如下:

int valueOne;
int valueTwo;
valueOne = valueTwo = 0;
@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中以类似的方式使用。

是的,这是可能的,并且可以按照您的预期工作。请注意,对于对象,您当然会始终获得相同的实例,而不是副本!对于NSNumber来说,这可能还可以,但对于其他用例来说可能不行

即使有些人喜欢使用它,我一般也不推荐。这使得以下两个任务看起来太相似了:

valueOne = valueTwo = 0;
valueOne = valueTwo == 0;
同样地:

[[MySingleton sharedManager] setPlayerOneScore:pOneScore = 0];
[[MySingleton sharedManager] setPlayerOneScore:pOneScore == 0];
==类型的语句更常见,这会使另一个语句看起来像是有人忘记了一个字符。这意味着我必须验证作者的真实意思。同样的机制也可用于将赋值与if相结合,这通常被认为是类似的混淆

这就是为什么像斯威夫特这样的现代语言会回到这一点上,实际上却不允许这样做。

个人

[[MySingleton sharedManager] setPlayerOneScore:pOneScore = 0];
看起来有点奇怪,对我来说可能容易出错,但是

_valueOne = _valueTwo = @(0);
看起来不错。事实上,我一直在用它来节省一些打字时间,在我看来,只要你知道自己在做什么,做任何事情都可以。顺便说一下,您不需要在@0中使用括号-只要@0就足够了

是的,你可以用Java和C来做

很高兴知道:之所以可以进行这种赋值,是因为像a=0这样的表达式实际上返回的值在本例中为0,因此b=a=0与b=a=0相同,因为赋值运算符是右关联的


在他们的新语言Swift中,苹果认为这是一个坏主意,因此在Swift中删除了该行为,并且a=0返回Void,这意味着什么也不返回,您不能再在Swift中执行此串行赋值。

我在这里看到的主要危险是它使您的代码更难阅读,没有任何真正的好处。当你浏览代码时,很容易忽略一个事实,那就是setPlayerScore:call中有一个赋值语句。到目前为止,我理解了。我很高兴你也提到了斯威夫特。现在,pOneScore==0,我猜将返回BOOL。这是有意义的,但事实并非如此。它将只返回0或1,因为C最初没有布尔类型。Swift会,因此Swift编译器会指出错误。