在 Objective C 中重构显式的 getter 和 setter

Refactor out explicit getters and setters in Objective C

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

所以这个:

[instance member]
[instance setMember:value]

应该变成这样:

instance.member
instance.member = value

目前正在为此开发正则表达式,但如果已经解决了这个问题,我将不胜感激利用其他人的工作成果。

要将所有 [instance setMember:value]; 调用转换为 instance.member = value;,请使用 Xcode 的重构:Edit > Refactor > Convert to Modern Objective-C语法。如果适用,它还会转换 getters,例如 variable = [instance member]; 调用到 variable = instance.member; 语法。

我可能误解了你的意图,但我想指出使用 instance.member; 是不好的风格 如果你没有将值赋给变量.如果您因为副作用而调用方法,请改用 [instance method]; 以使意图更清楚。仅使用点语法来实际读写属性以避免混淆。

Xcode 如果你有一个返回值的 method/property 并且你在调用 getter 而不将其分配给变量(如 viewController.view;[viewController view];) 因为假定此调用是错误的。为了摆脱你得到的警告,你需要明确地告诉编译器你这样做是为了副作用(例如,为了确保 XIB 被加载)通过强制转换为 void,如在 (void)[viewController view];.

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