Objective C约定:何时使用For和何时使用With

时间:2012-09-01 09:36:35

标签: iphone objective-c ios xcode cocoa

根据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?

5 个答案:

答案 0 :(得分:5)

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

当您说viewWithTag:时,您询问UIView 任何视图是否包含该标记。可能有几个。 UIView将返回其中一个。

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

修改

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

例如,

NSString的{​​{1}}使用by,只是因为该函数是使用动词附加编写的。你不能说有关,这是不好的英语。

答案 1 :(得分:3)

从我的观察

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

e.g。用于设置NSMutableArray对象

 - (id)initWithCapacity:(NSUInteger)numItems

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

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

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

希望这有助于消除疑虑

答案 2 :(得分:3)

似乎with用于直接属于对象的属性。 UIView具有tag属性,因此viewWithTag:14可以改为"查找标记属性为14" 的视图。

当您将对象放入与键相关联的字典中时,此键不一定是对象本身的一部分。 objectForKey:@"foo"是一种说出"找一个与该键相关联的对象" foo" 的方法。

答案 3 :(得分:0)

Apple指南不对何时使用或与之一起提出任何此类声明。编码约定的要点是指出参数的类型可能是什么,并编写自然发声的方法签名。

方法名称中for或with的原因是识别方法的第一个参数的类型或目的,这有助于它更好地阅读。

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

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

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

也不要忘记(通过)NSURL urlByAppendingPathComponent等 - 感受它并且你不会出错

答案 4 :(得分:0)

无论何时拥有或拥有参数,您都会使用“with”,或者“with”字左侧的对象将使用相对永久的属性。

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

  • viewWithTag - 返回“拥有”指定“标记”属性的视图。

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

但是对于多重的松散关联 在单个方法调用中具有相同类型的对象,通常使用类似于:

的东西
doSomethingForFoo:withThisOtherFoo:havingYetAnotherFoo:

所以这种复杂呼叫的顺序是:

  1. 具有