推荐使用instancetype
作为返回值init
和相关方法的方法,请参阅最新的clang features。但是,协议中返回值的最佳实践是什么copyWithZone:
(有关以前的最佳实践,NSCopying
请参阅此线程)?在clang文章中从方法的命名方案推断类的规则中没有提到,但我不明白为什么它应该与alloc
方法的返回值不同。
类型推断是否不适用于copy
-methods?我们应该返回还是返回instancetype
我们实际返回的特定类类型?
推荐使用instancetype
作为返回值init
和相关方法的方法,请参阅最新的clang features。但是,协议中返回值的最佳实践是什么copyWithZone:
(有关以前的最佳实践,NSCopying
请参阅此线程)?在clang文章中从方法的命名方案推断类的规则中没有提到,但我不明白为什么它应该与alloc
方法的返回值不同。
类型推断是否不适用于copy
-methods?我们应该返回还是返回instancetype
我们实际返回的特定类类型?
你不应该使用instancetype
. 这里最明显的情况是存在不可变/可变的区别—— acopy
的ANSMutableString
返回 anNSString
您应该将其视为不可变的。在这种情况下,API 不会返回与接收方相同类型的实例。
另一个原因是您应该匹配声明的签名,正如 Josh Caswell 指出的 (+1)。
当然,没有什么能阻止你用你想要的语义和签名来声明你自己的协议。
你没有声明copyWithZone:
;它已经被协议声明了,如果你的类说它符合协议,那么它也采用现有的声明。该声明id
用作其返回类型。
当然,在实现方法时必须写下返回类型,但是编译器在进行类型检查时使用的是声明,而不是定义。
据我所知,instancetype
它与*“兼容” id
,所以你可以在你的定义中写出来,但严格来说,我认为最好使用与声明完全相同的类型。
因此,使用id
.
*即,Clang 不会抱怨copyWithZone:
被定义instancetype
为它的返回类型。