以下是一些 Apple 类中的一些方法:
- (NSManagedObject *)objectWithID:(NSManagedObjectID *)objectID;
- (UITableViewCell *)dequeueReusableCellWithIdentifier:(NSString *)identifier;
+ (id)insertNewObjectForEntityForName:(NSString *)entityName inManagedObjectContext:(NSManagedObjectContext *)context
期望所有这些方法返回返回类型的子类是合理的。因此,返回的对象通常被分配给预期类型的变量,例如:
BCCustomTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:[BCCustomTableViewCell cellIdentifier]];
这让编译器不高兴;类型转换解决了这个问题,但是这样的类型转换很脏:
BCCustomTableViewCell *cell = (id)[tableView dequeueReusableCellWithIdentifier:[BCCustomTableViewCell cellIdentifier]];
但是,当返回类型为 id
时,可以删除此转换,尽管以某种类型安全为代价,从而使我的代码更清晰:
BCPerson *person = [NSEntityDescription insertNewObjectForEntityForName:BCPersonEntityName inManagedObjectContext:context];
就我个人而言,我更喜欢返回类型为 id
的情况。 Apple 选择一种方法而不是另一种方法是否有任何理由,或者仅仅是因为编写这些方法的开发人员的偏好?
最佳答案
在您描述的三个示例中,两个不同的原则在起作用:
在前两个方面,Apple 希望您使用强制转换作为“我知道我在做什么”之类的事情:当您通过标识符访问通用对象时,您可能最终会对类感到惊讶返回值,除非您知道自己在做什么。
在后面的例子中,方法本质上是一个工厂方法,相当于alloc init
,在大多数情况下你最好知道你在做什么。
换句话说,回答你的问题:
对于工厂方法,id
,对于getter,与setter相同。
关于objective-c - 当方法可以返回子类时,返回类型应该是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4613582/