转换为 id 与真实类类型之间的差异,目标 C

2024-05-07

以下 2 种说法有什么区别?

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

and

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

简短的回答:没有。

这两种强制转换都可以防止编译器发出有关指针类型不兼容的警告。

不管怎样,由于 Objective-C 中的类型在运行时不会被检查,所以当你运行它时不会有什么不同。

事实上

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

are 完全地运行时等效。

唯一明显的区别是编译器会在第三种情况下警告您,因为类型似乎不兼容。因为里氏替换原则 http://en.wikipedia.org/wiki/Liskov_substitution_principle,事实上,你不能分配一个泛型UIView to a UILabel。通过强制转换,您可以告诉编译器:“相信我,我知道这会没问题”。

然而从这个角度来看,将其投射到id确实没有意义:您正在使类型更加通用,而您应该将其缩小到正确的子类。

总而言之,作为一个好的实践,建议您将返回类型转换为您期望的确切类。它将更有意义,并且代码的可读性也会更好。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

转换为 id 与真实类类型之间的差异,目标 C 的相关文章

随机推荐