我想创建一个方法uniq,它接受一个数组,但元素类型可以是不同的,例如[1,“Hello”,true,234.3]或者所有元素类型可以相同[1,2,3,4] < / p>
func uniq(array: AnyObject[]) -> AnyObject[] {
...
}
使用AnyObject并返回AnyObject数组是最佳做法吗?
我也可以使用==等号来比较两个AnyObjects,它会比较它们而不管它们是同一类型吗?
答案 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
,您可能需要重新考虑设计。
Any
和AnyObject
应被视为必要的恶:需要与动态类型的Objective-C框架进行互操作。为了具有前瞻性,目标应该是尽可能避免使用它们。
对于问题的第二部分,GoZoner的答案非常好。