2015-04-01 44 views
1

我目前正在重构一些Objective-C代码以删除显式获取者和设置者。在目标C中重构显式获取者和设置者C

所以这样的:

[instance member] 
[instance setMember:value] 

应该成为这样的:

instance.member 
instance.member = value 

目前正在为这一个正则表达式,但如果这已经解决了,我会很感激考虑别人的优点工作。

+0

为什么?这对你来说是非常重要的风格吗? – Wain 2015-04-01 18:35:10

+0

它比必要的更冗长。它是一个样本代码,可以在内部和外部无处不在复制/粘贴。 – escapecharacter 2015-04-01 18:36:10

+0

编译器具有这样的信息,因为当有人使用点语法时,它会做相反的处理;同样你也必须解析一般情况下的属性声明,因为访问器可以被重命名。 – 2015-04-01 18:44:22

回答

3

要让所有[instance setMember:value];调用转换为instance.member = value;,使用Xcode的重构:编辑>重构>转换成现代的Objective-C语法。如果适用,它还会将获取者转换为variable = [instance member];调用variable = instance.member;语法。

我可能会误解你的意图,但我想指出的是,使用instance.member;是不良作风如果你不值赋值给一个变量。如果您因为副作用而调用方法,请使用[instance method];来代替,以使意图更清晰。仅使用点语法来实际读取和写入属性以避免混淆。

的Xcode 6.3居然警告你,如果你有一个方法/属性,该属性返回一个值,你调用,吸气,而不将其分配给一个变量(如viewController.view;[viewController view];),因为它是假设这个呼叫是错误。为了摆脱所得到的警告,你需要明确地告诉编译器,你正在做的副作用(例如,以确保XIB被加载)通过铸造到void,如(void)[viewController view];

若要转换某些setter重构错过,您可能需要手动转换这些,恐怕。要找到它们,请转至查找导航器(Cmd-3),选择查找>正则表达式。使用正则表达式\[\[\w+\s+\w+\]\s+set(不幸的是,不能简单地使用正则表达式转换这些调用,因为您需要转换一个字符:[foo setBar:123]需要转换为foo.bar = 123,这意味着B需要转为小写b )。您可以为上下文菜单编写一项服务,以进行必要的转换(请参阅top answer to "Sort Lines in Selection" for Xcode 4关于如何编写服务等)以加快该手动任务的速度。

+0

正在调查。在预加载viewController时,关于'(void)'的注释已经解决了警告。 – escapecharacter 2015-04-01 19:31:45

+0

嗯...... *转换为现代Objective-C语法*抓住了一些东西,但没有抓住我想要的一切。它传递了诸如'[[self collider] setHidden:YES]';' – escapecharacter 2015-04-01 20:24:33

+0

无赖。我已经更新了我对这个问题的建议。 – DarkDust 2015-04-02 07:31:03