使用AnyObject接受Swift中任何类型的元素数组是否合适?

时间:2014-06-06 01:05:09

标签: swift

我想创建一个方法uniq,它接受一个数组,但元素类型可以是不同的,例如[1,“Hello”,true,234.3]或者所有元素类型可以相同[1,2,3,4] < / p>

func uniq(array: AnyObject[]) -> AnyObject[] {
    ...
}

使用AnyObject并返回AnyObject数组是最佳做法吗?

我也可以使用==等号来比较两个AnyObjects,它会比较它们而不管它们是同一类型吗?

3 个答案:

答案 0 :(得分:1)

您可以使用泛型来创建可以接受任何类型的类型函数,而无需转向AnyObject,即:

func uniq<T>(array: T[]) -> T[] {
    ...
}

为了能够比较项目,您可以添加通用约束,以确保调用此方法的所有类型都符合Equatable协议,这将允许您使用==对项目,即:

func uniq<T : Equatable>(array: T[]) -> T[] {
    ...
}

答案 1 :(得分:1)

结合两个问题,使用

func uniq (array: Equatable[]) -> Equatable[] { ... }

详细信息:您无法将AnyObject类型的对象与==进行比较,因为==要求对象符合Equatable协议;不是所有的对象都这样做。

正如@mythz所说,你可以使用:

func uniq<T> (array: T[]) -> T[] { ... }

但是每次在任意对象数组上使用uniq时,您需要使用以下方法调用该方法:

uniq<AnyObject> (someArray)

你可能没问题,特别是如果你有时想要uniq()使用统一类型的对象(Int,Double,...,Equatable)。如果你只想要一个适用于任何类型的功能,那么你的建议是:

func uniq (array: AnyObject[]) -> AnyObject[]) { ... }

很好。

答案 2 :(得分:0)

在静态类型语言中,使用类似AnyObject的类型不是最佳做法:它表示您正在抛出窗口中的类型安全性。如果您的设计依赖于AnyObject,您可能需要重新考虑设计。

AnyAnyObject应被视为必要的恶:需要与动态类型的Objective-C框架进行互操作。为了具有前瞻性,目标应该是尽可能避免使用它们。

对于问题的第二部分,GoZoner的答案非常好。