Iphone “怎么做?”;item.enabled=item2.enabled=item3.enabled=value";工作

Iphone “怎么做?”;item.enabled=item2.enabled=item3.enabled=value";工作,iphone,objective-c,Iphone,Objective C,感觉代码越少越好,所以想“优化”如何同时启用多个项目: button1.enabled = YES; button2.enabled = YES; textField.enabled = YES; …使用此代码。但是它实际上是做什么的?我相信按钮2的启用状态将由设置textField启用状态的结果来定义?如果textField案例因未知原因失败,则button1将获得设置button2启用状态的操作结果 至少在理论上,textField.enabled可以是任何东西,button2.enabl

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

button1.enabled = YES;
button2.enabled = YES;
textField.enabled = YES;
…使用此代码。但是它实际上是做什么的?我相信按钮2的启用状态将由设置textField启用状态的结果来定义?如果textField案例因未知原因失败,则button1将获得设置button2启用状态的操作结果

至少在理论上,textField.enabled可以是任何东西,button2.enabled NO和button1.enabled YES

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

会出什么问题?这安全吗?

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

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

  • textField.enabled
    将等于YES
  • button2.enabled
    将等于操作结果
    textField.enabled=YES将是
  • button1.enabled
    将等于
    button2.enabled=YES将等于
    (从2开始))

  • 诀窍在于赋值也是C语言中的一个表达式。它的值是存储到被赋值变量的值。换句话说,
    foo=5
    5
    赋值给
    foo
    ,整个表达式具有值
    5

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

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

    请注意单个
    =
    ,这不是一个bug。但是,由于它可能是一个很大的bug来源(当你真正指的是
    =
    ),现代编译器经常会对赋值发出警告,你必须用另一对大括号将其括起来以消除警告:
    如果((self=[super init])
    ,我99%肯定这是一个微妙的错误。IIRC,点语法设置器仅返回指定的值,而不是属性的结果值。因此,例如,如果一个假设的
    -[Person setPhoneNumber:][/code>方法格式化了电话号码的美式格式,
    textField.stringValue=Person.phoneNumber=@“5555551234”
    将把
    @“555555551234”
    放在文本字段中,而不是
    @“(555)555-1234”
    (这将是访问属性的结果)。在实践中,这种区别通常并不明显,因为getter和setter通常只是ivar的哑访问器,但它偶尔会咬到你。谢谢,@Chuck。为了更准确,编辑了我的答案。恰克,你能把这个写下来作为答案吗?即使Nekto和zoul都提出了很好的观点,我还是会选择“正确”的。如果代码变得模棱两可,或者容易出现@Chuck在下面的评论中指出的细微错误,那么代码越少越好。较短的代码不一定更具可读性——聪明往往会降低可读性。通常最好避免这样的把戏,除非你有很好的理由不这样做。6个月后你会感谢自己的!