Objective-c返回方法返回NSMutableArray而不是声明的NSArray返回类型

Pet*_*rbo 8 cocoa objective-c return-type nsmutablearray nsarray

如果我想返回一个像这样的不可变数组+ (NSArray *)ids但是在这个方法中我声明了一个NSMutableArray因为我想用它来排序它-sortUsingSelector:.

返回此方法非常有效.

  • 但编写声明返回方法应该是一种类型而实际类型是另一种类型的代码是否"没问题"?

  • 这是否有效,因为它NSMutableArray是一个子类NSArray

  • 实际的回报值是一个NSArray还是一个NSMutableArray

小智 6

(...)编写声明返回方法应该是一种类型而实际类型是另一种类型的代码是"没关系"吗?

是的,提供的类型是兼容的; 看下一段.事实上,在Cocoa(特别是类集群)中也存在一些这样的情况.

这是否有效,因为NSMutableArray是NSArray的子​​类?

究竟.由于NSMutableArray是它的子类NSArray,它继承了它的所有方法和声明的属性,所以它的公开行为就像NSArray.这被称为Liskov替代原则.

实际的返回值是NSArray还是NSM​​utableArray?

返回值是您返回的任何值.既然你回来了NSMutableArray,那就是了NSMutableArray.从调用者的角度来看,它是一个可以像一个对象一样使用的对象NSArray.

  • 从类型为返回`NSArray*`的方法返回一个可变数组是可以的,但改变你从一个类型返回`NSArray*`的方法得到的数组是不行的.如果方法的声明没有明确地说它返回一个可变数组,那么调用者应该永远不会认为它返回一个可变数组.即使在您自己的应用程序中执行此操作也意味着您使自己的代码更加脆弱.如果类正在告诉自己的数组对自己进行排序,那么该方法应该是一个显式返回mutable的访问器.任何其他类都应该制作自己的可变副本. (5认同)