gpt4 book ai didi

objective-c - 当方法可以返回子类时,返回类型应该是什么?

转载 作者:太空狗 更新时间:2023-10-30 04:00:40 24 4
gpt4 key购买 nike

以下是一些 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com