【问题标题】:Using instancetype as the return type of a copy in Objective-C?在Objective-C中使用instancetype作为副本的返回类型?
【发布时间】:2013-10-18 17:39:25
【问题描述】:
使用instancetype作为init的返回值和相关方法是推荐的继续方式,见最新的clang features。但是,w.r.t 的最佳做法是什么? NSCopying 协议中copyWithZone: 的返回值(参见this thread 了解以前的最佳实践)?在clang文章中从方法的命名方案推断类的规则中没有提到,但我不明白为什么它应该与alloc方法的返回值不同。
类型推断是否不适用于copy-methods?我们还应该返回instancetype 还是我们实际返回的特定类类型?
【问题讨论】:
标签:
objective-c
clang
foundation
nscopying
instancetype
【解决方案1】:
您不应使用instancetype。这里明显的情况是存在不可变/可变的区别——NSMutableString 的copy 返回一个NSString,您应该将其视为不可变的。在这种情况下,API 不会返回与接收方相同类型的实例。
另一个原因是您应该匹配声明的签名,正如 Josh Caswell 指出的 (+1)。
当然,没有什么能阻止您使用所需的语义和签名声明自己的协议。
【解决方案2】:
你没有声明copyWithZone:;它已经被协议声明了,如果你的类说它符合协议,那么它也采用现有的声明。该声明使用id 作为其返回类型。
当然,在实现方法时必须写下返回类型,但编译器在进行类型检查时使用的是声明,而不是定义。
据我所知,instancetype 与 id* “兼容”,因此您可以在定义中写出它,但严格来说,我认为最好使用与声明完全相同的类型.
因此,请使用id。
*即,Clang 不会抱怨 copyWithZone: 被定义为 instancetype 作为其返回类型。