在方法中使用id类型是一种好习惯吗?

时间:2014-08-26 14:28:45

标签: ios objective-c api

我正在创建一组API,一些用户建议我将id类型用于可以接受自定义对象(由API定义)或字符串而不是创建两个版本的特定方法。在方法中使用id类型是一种好的还是可接受的做法? Apple是否使用他们的任何API做到了?

2 个答案:

答案 0 :(得分:1)

那将是非常糟糕的做法。如果你正在创建一个API,你需要保持完全控制,并允许用户将任何对象传递给你的方法,此时你必须将它强制转换为你提到的那个对象或字符串,这取决于传递的内容。创建具有不同参数的两个方法不仅没有问题,而且遵循多态性对T的原则。

答案 1 :(得分:0)

接受id本身并不是好的或坏的做法。你会获得多少手动程序if / then / else / if / then / else废话?如果有很多话,那就错了。

换句话说:如果与不同类型的对象相关的条件逻辑最终是隐式的,那么通过Objective-C调度机制,那么设计是好的。如果你最终暗示重新实现动态调度,那么你就完全错了。

Apple经常这样做。就在我的头顶,有:

  • 根据Nikolai的评论,所有集合类型:集合,字典,数组等
  • %@作为格式说明符的任何内容:NSLogNSString上的某些方法等。
  • 任何仍使用非正式协议的内容。
  • 运行时或半关闭的任何内容,如键值编码。
  • 归档和用户默认值。
  • 任何可供您自己使用的存储空间 - userInfoNSTimer以及其余部分的耐用版本。
  • 使用目标/操作的任何地方 - 所有UIControl s,通知中心等

根据我的评论,假设您的自定义类具有此方法:

- (NSData *)dataUsingEncoding:(NSStringEncoding)encoding

并且假设它是被传递给字符串或自定义对象的任何人调用的唯一方法。那么id将是正确的选择,因为你实际上已经实现了一个非正式的协议,而真正传递一个对象的东西并不关心它是否是一个字符串。唯一的合同要求是非正式协议,协议是非正式的,即类型语法没有足迹。

相反,假设你的自定义类没有与NSString相同的方法,你的代码看起来像:

- (void)myMethod:(id)object
{
    if([object isKindOfClass:[NSString class]])
        [self myMethodOnString:object];
    else
        [self myMethodOnCustomClass:object];
}

然后id不合适。你只是模糊了方法的作用,并隐含地重现了运行时内置的工作。