[英]Array extension generic Equatable - “Cannot invoke '==' with …”
我正在嘗試編寫Swift數組的擴展,但是在嘗試編譯時遇到了一些奇怪的錯誤。
我的代碼:
extension Array
{
func itemExists<T: Equatable>(item: T) -> Bool
{
for elt in self
{
if elt == item
{
return true
}
}
return false
}
}
錯誤:
無法使用類型為((T,T)'的參數列表調用'=='
我為什么得到這個? 我正在使用Equatable
協議?
我還嘗試過的是:
extension Array
{
func itemExists<T: Equatable>(item: T) -> Bool
{
var array:[T] = self
for elt in array
{
if elt == item
{
return true
}
}
return false
}
}
我收到一個有趣的錯誤的地方:
“ T”與“ T”不同
我想念什么? 我已經閱讀了Apple文檔,但是我已經在使用Equatable
協議來在'T'
上使用==
運算符。
使用Swift 3.0(我認為有些更高的2.x版本)可以通過使用where
子句引用關聯的Element
類型來解決:
extension Array where Element: Equatable
{
func itemExists(item: Element) -> Bool
{
for elt in self
{
if elt == item
{
return true
}
}
return false
}
}
我找到了解決方案。
正如MartinR alreary所說,我的方法僅適用於Equatable元素數組,並且您不能在對模板有更多限制的通用類型上編寫方法。
有兩種方法-將我的代碼作為函數而不是擴展來編寫,或者使用此技巧:
extension Array
{
func itemExists<T: Equatable>(item: T) -> Bool
{
return self.filter({$0 as? T == item}).count > 0
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.