在Objective C中重构显式getter和setter

时间:2015-04-01 18:34:21

标签: objective-c regex refactoring

我目前正在重构一些Objective-C代码以删除显式的getter和setter。

所以这个:

[instance member]
[instance setMember:value]

应该成为这个:

instance.member
instance.member = value

目前正在制作一个正则表达式,但如果已经解决了这个问题,我会很感激利用别人的工作。

1 个答案:

答案 0 :(得分:3)

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

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

Xcode 6.3实际上会警告您,如果您有一个返回值的方法/属性,并且您在不将其分配给变量的情况下调用getter(如viewController.view;或{{1因为它假设这个调用是错误的。要摆脱你得到的警告,你需要通过强制转换为[viewController view];来明确地告诉编译器你正在为副作用做这件事(例如,确保加载XIB) ,如void

为了转换某些制定者,重构错过了,你可能需要手动转换,我很害怕。要找到它们,请转到查找导航器(Cmd-3),选择查找>正则表达式。使用正则表达式(void)[viewController view];(遗憾的是,您无法使用正则表达式转换这些调用,因为您需要转换一个字符:\[\[\w+\s+\w+\]\s+set需要转为[foo setBar:123]这意味着foo.bar = 123需要转为小写B)。您可以为进行必要转换的上下文菜单编写服务(请参阅top answer to "Sort Lines in Selection" for Xcode 4如何编写服务等)以加快手动任务的速度。