4

以下 2 个语句之间可能有什么区别?

UILabel *mainLabel = (id) [cell viewWithTag:10];

UILabel *mainLabel = (UILabel*) [cell viewWithTag:10];
4

1 回答 1

7

简短的回答:没有。

两种强制转换都将具有防止编译器警告指针类型不兼容的效果。

无论如何,由于在运行时不会检查 Objective-C 中的类型,因此在运行它时不会有什么不同。

事实上

UILabel *mainLabel = (id) [cell viewWithTag:10];
UILabel *mainLabel = (UILabel*) [cell viewWithTag:10];
UILabel *mainLabel = [cell viewWithTag:10];

在运行时是完全等价的。

唯一明显的区别是编译器会在第三种情况下警告您,因为类型似乎不兼容。由于Liskov 替换原则,实际上,您不能将泛型分配UIView给 a UILabel。通过强制转换它你告诉编译器:“相信我,我知道这会好的”。

但是,从这个角度来看,将其强制转换为id并没有真正意义:您正在使类型更通用,而您应该将其缩小到适当的子类。

总结一下,作为一种好的做法,建议您将返回类型转换为您期望的确切类。它会更有意义,并且代码可读性也会更好。

于 2013-06-29T23:40:04.997 回答