Objective-C规范:何时使用For,何时使用With

9
根据苹果指导方针,似乎有些令人困惑,例如方法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?

1
很好的问题,顺便说一句。这是我需要答案却从未想过要问的问题之一。甚至可以说是连自己都没有问过。 - Mazyod
苹果程序员弗雷德总是使用“for”,而苹果程序员吉姆总是使用“with”。 - Hot Licks
5个回答

5
我认为这比大多数答案想象的要简单得多。我认为它与复杂的编程语言规范关系较小,与所涉及的对象的独特性有更多关系。
当你使用“viewWithTag:”时,你要求“UIView”返回具有该标记的任何视图。可能会有几个。 “UIView”将返回其中一个。
然而,“objectForKey:”(对我来说)听起来应该与该键相关联的单个对象(或nil)存在。因此,该键有点存在,并且与单个对象紧密耦合。
编辑:
有一个答案提到了“by”的存在,这进一步说明了这种约定与编程语言的复杂性无关。这只是自然的英语。
例如,“NSString”的“stringByAppendingString:”使用“by”,仅因为该函数是用动词“appending”编写的。你不能说“withAppending”,那是不好的英语。

1
我只是想在这个讨论中提供“多元性”这个词。这是我首先想到的一个词,也是在这个答案中解释的概念(+1)。至于“通过”,它意味着行动,而另一个仅意味着选择。 - Chris Trahey
新的编辑教人们语法和非技术相关的东西。选择一些其他的论坛。 - Vimal Venugopalan

3

根据我的观察

在设置或获取对象时,你需要使用WITH关键字。

例如:设置NSMutableArray对象

 - (id)initWithCapacity:(NSUInteger)numItems

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

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

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

希望这能帮助你消除疑虑。

不幸的是,NSDictionary 的方法是 objectForKey:setObject:forKey:,这与 Objective-C 属性相去甚远。 - Mazyod

3
似乎with用于直接属于对象的属性。例如,UIView具有tag属性,因此viewWithTag:14可以改为"查找tag属性为14的视图"
当您将对象放入字典中并与键关联时,该键不一定是对象本身的一部分。objectForKey:@"foo"是一种说法,意思是"查找与键 'foo' 关联的对象"

+1 这是我对它的描述。with 表示传入的值是目标对象的属性,而 for 表示传入的值与目标对象有环境上的关联。 - Dave DeLong

0

当参数是被拥有或将要被拥有,或者是左侧对象的一个相对永久的属性时,您使用 "with"。

  • initWithCapacity / arrayWithCapacity - 容量将成为调用容器对象的属性,并且将是相对永久的(直到您添加超出初始容量的对象)

  • viewWithTag – 返回具有指定 "tag" 属性的视图。

而您使用 "for" 来表示 "期望" 对象与 "令牌" 对象之间的松散关联。 - objectForKey / attributeForValue – 通常 "object" 不拥有该键。 - documentForWindow – 窗口由窗口控制器拥有,而不是文档。此外,每个文档可能会有多个窗口。

但是对于同一方法调用中多个相同类型的对象的松散关联,通常使用以下内容:

doSomethingForFoo:withThisOtherFoo:havingYetAnotherFoo:

因此,这种复杂调用的顺序是:

  1. for
  2. with
  3. having

0

苹果公司的指南并没有明确说明何时使用for或with。编码规范的重点是指示参数类型,并编写自然语言的方法签名。

方法名称中for或with的原因是为了识别方法的第一个参数的类型或目的,从而使其更易读。

苹果公司本身使用了几种约定,但基本目的是识别方法名称中的第一个参数,并在方法名称中使用for或with。

至于苹果公司的约定-get(whatever)甚至不是实际约定的一部分,所以你可以问何时使用get或不使用。

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

还有不要忘记(by)NSURL urlByAppendingPathComponent等-感受一下,你就不会错了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接