【问题标题】:Objective C convention: When to use For and when to use WithObjective C 约定:何时使用 For 以及何时使用 With
【发布时间】:2012-08-26 22:30:00
【问题描述】:

根据 Apple guideline ,似乎令人困惑,例如对于方法viewWithTag

在 Java 中,我会有一个名为

的方法
getViewByTag // Java version, equivalent to viewWithTag in Obj-C

但是我也发现有objectForKey这样的方法,那为什么不直接使用objectWithKey呢?

getObjectByKey or just get // Java version, equivalent to objectForKey, 
                           // but why not objectWithKey? Or not viewForKey above?

【问题讨论】:

  • 好问题,顺便说一句。这是我需要回答但从未想过要问的问题之一。就此而言,甚至不问自己。
  • 苹果程序员 Fred 总是使用“for”,而苹果程序员 Jim 总是使用“with”。

标签: iphone objective-c ios xcode cocoa


【解决方案1】:

我实际上认为它比大多数答案所想的要简单得多。我认为这与复杂的编程语言细节关系不大,而与所讨论对象的唯一性有关。

当您说viewWithTag: 时,您是在向UIView 询问具有该标签的any 视图。可能有几个。 UIView 将返回其中之一。

但是,objectForKey:(对我来说)听起来应该有一个与该键关联的对象(或 nil)。因此,键有点存在并且绑定(紧密耦合)到单个对象。

编辑:

有一个答案提到了“by”的存在,这进一步暗示了该约定与编程语言的复杂性无关。这只是自然的英语。

NSStringstringByAppendingString:,例如,使用 by,只是因为函数是用动词 appending 编写的。你不能说withAppending,那是糟糕的英语。

【讨论】:

  • 我只是想为这次讨论提供“复数”这个词。这是我首先想到的一个词,也是这个答案(+1)中解释的概念。就“by”而言,这意味着行动,而另一个只是意味着选择。
  • 新的编辑教人们语法和非技术性的东西。选择一些other论坛
【解决方案2】:

根据我的观察

在设置/获取对象时,您使用WITH

例如用于设置 NSMutableArray 对象

 - (id)initWithCapacity:(NSUInteger)numItems

在设置/获取对象的属性时,您使用 FOR

例如用于为 NSMutableDictionary 类型的属性设置值

- (void)setValue:(id)value forKey:(NSString *)key

希望这有助于消除您的疑问

【讨论】:

  • 不幸的是,NSDictionary 的方法是 objectForKey: setObject:forKey:,这与 Objective-C 的属性相差甚远。
【解决方案3】:

似乎with 用于直接属于对象的属性。 UIView 有一个tag 属性,所以viewWithTag:14 可以改写为“查找tag 属性为14 的视图”

当您将对象放入字典中并与键关联时,该键不一定是对象本身的一部分。 objectForKey:@"foo" 是一种表达方式“查找链接到键“foo”的对象

【讨论】:

  • +1 这就是我要描述的方式。 with 表示传入的值是目标对象的属性,而for 表示传入的值是间接关联到目标对象的。
【解决方案4】:

Apple 指南并未就何时使用 for 或 with 做出任何此类声明。编码约定的要点是指出参数的类型可能是什么,并编写听起来自然的方法签名。

方法名中使用for或with的原因是为了标识方法第一个参数的类型或用途,有助于更好地阅读。

Apple 本身使用了几种约定,但这是基本目的,没有具体的对错,只是尝试用 for 或 with 来标识方法名称中方法的第一个参数。

至于 Apple 约定 - get(whatever) 甚至不是实际约定的一部分,所以你可以问我什么时候使用 get 或不使用。

阅读此http://cocoadevcentral.com/articles/000082.php

也不要忘记(通过)NSURL urlByAppendingPathComponent 等 - 感受一下,你就不会出错

【讨论】:

    【解决方案5】:

    只要参数被拥有或将被拥有,或者将成为“with”字左侧的对象的相对永久属性,您就使用“with”。

    • initWithCapacity / arrayWithCapacity - 容量将是被调用容器对象的一个​​属性,并且是相对永久的(直到您向其中添加超出初始容量的对象)

    • viewWithTag – 返回“具有”指定“标签”属性的视图。

    而您使用“for”来表示“所需”对象和您用来获取它的“令牌”对象之间的松散关联。 - objectForKey / attributeForValue – 通常“对象”不拥有密钥。 - documentForWindow - 窗口由窗口控制器拥有,而不是文档。此外,每个文档可能有多个窗口。

    但是对于多个松散的关联 在单个方法调用中具有相同类型的对象,习惯上你使用类似的东西:

    doSomethingForFoo:withThisOtherFoo:havingYetAnotherFoo:
    

    所以这种复杂调用的顺序是:

    1. 拥有

    【讨论】:

      猜你喜欢
      • 2011-07-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-19
      • 1970-01-01
      • 1970-01-01
      • 2012-02-20
      • 2012-03-13
      • 2015-01-07
      相关资源
      最近更新 更多