2014-06-06 22 views
0

我想創建一個方法uniq,它接受一個數組,但元素類型可以不同,例如[1,「Hello」,true,234.3]或所有元素類型可以相同[1,2,3,4]使用AnyObject接受Swift中任何類型的元素數組是否好用

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

使用AnyObject並返回AnyObject數組是否是最佳實踐?

也可以使用==等號來比較兩個AnyObjects,它會比較它們,無論它們是相同的類型嗎?

回答

1

您可以使用泛型創建的類型化功能,可以接受任何類型,而不訴諸上溯造型到AnyObject,即:

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

爲了能夠能夠比較的項目可以通用約束添加到確保調用這個方法符合Equatable協議,這將允許您使用==對抗項目,即所有類型:

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

您的兩個問題相結合,使用

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

詳細信息:你不能因爲==需要==對象符合Equatable協議比較AnyObject類型的對象;並非所有的物體都這樣

正如@mythz說,你可以使用:

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

但後來每次任意對象的數組上使用uniq時候你就需要調用該方法:

uniq<AnyObject> (someArray) 

你可能會很好,特別是如果你有時想用統一類型的對象(Int,Double,...,Equatable)來使用uniq()。如果你只是想要一個功能適用於任何類型,任何時間,那麼你的建議是:

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

是好的。

0

在靜態類型的語言中,使用類似AnyObject的類型不是最佳做法:它表示您正在將類型安全性扔出窗外。如果您的設計依賴於AnyObject,則可能需要重新考慮設計。

Any and AnyObject應該被認爲是一種必要的罪惡:需要與動態類型的Objective-C框架進行互操作。爲了具有前瞻性,目標應該是儘可能地避免使用它們。

對於問題的第二部分,GoZoner的回答非常好。

相關問題