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
将等于YESbutton2.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个月后你会感谢自己的!