“item.enabled = item2.enabled = item3.enabled = value”如何运作?

时间:2011-09-14 06:04:55

标签: iphone objective-c

感觉像代码更少 - 更好代码所以想要“优化”如何同时启用多个项目:

button1.enabled = YES;
button2.enabled = YES;
textField.enabled = YES;

...使用此代码。但实际上做了什么?我相信启用button2状态将由设置textField启用状态的结果定义?如果textField案例由于未知原因而失败,那么button1将获得设置button2启用状态的操作结果吗?

至少在理论上textField.enabled可以是什么,button2.enabled NO和button1.enabled YES?!?!?

button1.enabled = button2.enabled = textField.enabled = YES;

可能出现什么问题?这根本安全吗?

2 个答案:

答案 0 :(得分:3)

技巧是赋值也是C中的表达式。它的值是存储到赋值变量的值。换句话说,foo = 55分配给foo,整个表达式的值为5

此功能会导致一些类似于您的快捷方式,最着名的快捷方式可能是while (*dst++ = *src++)将以空字符结尾的字符串src复制到dst。在Objective-C中,您经常可以在初始化程序中看到该功能:

- (id) init {
    if !(self = [super init]) // self = super init; self == nil?
         return nil;
    …
    return self;
}

注意单=,这不是错误。但是因为它可以成为错误的重要来源(当你真正意味着==)时,现代编译器会经常警告这个任务,你必须将它包含在另一对括号中以保持沉默警告:if ((self = [super init]))

答案 1 :(得分:2)

是的,这很安全。您将在YES之前将所有属性设置为=

如果我没有弄错,从右到左执行操作:

  1. textField.enabled将等于YES
  2. button2.enabled将等于textField.enabled = YES;
  3. 的操作YES的结果
  4. button1.enabled将等于button2.enabled = YES;,等于YES(来自2))