【问题标题】:Dangers of using keywords in method names在方法名中使用关键字的危险
【发布时间】:2014-01-27 01:12:50
【问题描述】:

我了解不允许使用关键字作为变量名。但是有些事情让我开始思考如何在方法名称中使用关键字。

我最近继承了一个 iOS 应用程序的 XCode 项目,在 许多 地方我注意到其他编码人员在方法名称中使用了关键字,例如:

- (NSMutableDictionary*) appendData:(NSMutableDictionary*)incomingData for:(NSDictionary*)responseData

- (int) findCompensatedIndexOf:(id)searchQuery in:(NSArray*)floorData

在上述方法中,使用了关键字forin。现在,该应用程序在模拟器和设备上都运行得非常好,这意味着它可以正常工作。另一方面,当在 XCode 中调用方法的方法名称上使用 CMD + Click 时,什么也没有发生。如果您 CMD + 单击一个方法,XCode 会跳转到其相关类中的方法,但不是此处。

现在我明白该应用程序完全按照它应该运行的方式运行,但在我的脑海中,我对此有点怀疑。毕竟,操作系统和 IDE 的核心是程序,它们确实认为有些东西是不同的。

回到正题,如果在方法名中使用关键字,究竟会面临什么样的危险(现在或将来)?如果现在有效,是否意味着它将一直有效,或者将来的更新可能会与此类方法发生冲突?

注意:我不确定这个问题是属于 SO 还是 Programmers。我要求版主做出决定,并在需要时进行迁移。

【问题讨论】:

    标签: objective-c xcode methods keyword


    【解决方案1】:

    首先,Objective-C 是一种文档松散的语言,我不知道是否有当前的官方正式语法,Apple 的最新版本 Objective-C 编程语言 是 2009 年和过时了。因此,以下所有内容都是(稍有根据的)猜测。

    在方法名称中使用等同于关键字的字母序列似乎没有限制,这不太可能。这是因为方法名称是其部分的串联,并且各个部分不是独立的实体,例如您的两个示例是appendData:for:findCompensatedIndexOf:in:,并且对包含与关键字匹配的字母子序列的标识符没有限制,例如forest 是有效的,即使它包含 for

    您所看到的看起来像是编译器的“功能”,其中各种接受关键字作为方法名称的一部分并让自己陷入混乱。如果子部分是关键字,则 CMD+Click 不起作用。例如,给定这两种方法:

    - (void) anotherMethod:(int)x for:(int)z arg:(int)y;
    - (void) anotherMethod:(int)x arg:(int)y;
    

    然后CMD+点击第一个方法的调用跳转到第二个方法...哎呀!

    语法着色也搞砸了,但这并不奇怪。

    我的建议是向 Apple 提交错误报告,至少这可能会导致正式回复,并避免使用关键字作为方法名称部分 - 不是因为代码不起作用,而是因为 Xcode 变得混乱。

    HTH

    【讨论】:

    • 我最终重命名了这些方法。至于错误报告,好吧,我是个拖延者。 :P
    【解决方案2】:

    您缺少一些重要的东西:尽管您在方法中使用了“for”和“in”,但它们不是方法名称,它们是其中的一部分,因为在目标 c 中,方法名称是全名,例如findCompensatedIndexOf:in: 和 appendData:for: 这就是为什么在我的理解中编译器没有显示方法错误而是显示变量,总名称不是关键字。

    所以这对您现在不是问题,将来也不会。

    【讨论】:

      猜你喜欢
      • 2011-07-27
      • 2018-12-02
      • 1970-01-01
      • 2015-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-17
      • 2012-07-18
      相关资源
      最近更新 更多