【问题标题】: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。这里明显的情况是存在不可变/可变的区别——NSMutableStringcopy 返回一个NSString,您应该将其视为不可变的。在这种情况下,API 不会返回与接收方相同类型的实例。

    另一个原因是您应该匹配声明的签名,正如 Josh Caswell 指出的 (+1)。

    当然,没有什么能阻止您使用所需的语义和签名声明自己的协议。

    【讨论】:

      【解决方案2】:

      你没有声明copyWithZone:;它已经被协议声明了,如果你的类说它符合协议,那么它也采用现有的声明。该声明使用id 作为其返回类型。

      当然,在实现方法时必须写下返回类型,但编译器在进行类型检查时使用的是声明,而不是定义。

      据我所知,instancetypeid* “兼容”,因此您可以在定义中写出它,但严格来说,我认为最好使用与声明完全相同的类型.

      因此,请使用id


      *即,Clang 不会抱怨 copyWithZone: 被定义为 instancetype 作为其返回类型。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-06-25
        • 1970-01-01
        • 1970-01-01
        • 2014-06-03
        • 1970-01-01
        • 1970-01-01
        • 2011-10-14
        相关资源
        最近更新 更多