Вот несколько методов из некоторых классов 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 использовала для выбора одного подхода над другим, или это просто из-за предпочтения разработчика, который написал методы?