Ios 数组扩展通用等式-“;无法调用'==';与……一起;
我试图编写Swift数组的扩展,但在编译时遇到了一些wierd错误 我的代码:Ios 数组扩展通用等式-“;无法调用'==';与……一起;,ios,arrays,swift,generics,Ios,Arrays,Swift,Generics,我试图编写Swift数组的扩展,但在编译时遇到了一些wierd错误 我的代码: extension Array { func itemExists<T: Equatable>(item: T) -> Bool { for elt in self { if elt == item { return true } }
extension Array
{
func itemExists<T: Equatable>(item: T) -> Bool
{
for elt in self
{
if elt == item
{
return true
}
}
return false
}
}
在那里我遇到了一个有趣的错误:
extension Array
{
func itemExists<T: Equatable>(item: T) -> Bool
{
for elt in self
{
if elt == item
{
return true
}
}
return false
}
}
“T”与“T”不相同
我错过了什么?我阅读了苹果的文档,但是我已经使用了equalable
协议,能够在'T'
上使用=
操作符,我找到了我的解决方案
正如MartinR Alriery所说,我的方法只适用于可等式元素的数组,并且不能在对模板更严格的泛型类型上编写方法
有两种方法-将代码作为函数而不是扩展编写,或者使用以下技巧:
extension Array
{
func itemExists<T: Equatable>(item: T) -> Bool
{
return self.filter({$0 as? T == item}).count > 0
}
}
扩展数组
{
func itemExists(item:T)->Bool
{
返回self.filter({$0 as?T==item}).count>0
}
}
对于Swift 3.0(我认为是后来的一些2.x版本),您可以通过使用where
子句引用关联的类型元素来解决这个问题:
extension Array where Element: Equatable
{
func itemExists(item: Element) -> Bool
{
for elt in self
{
if elt == item
{
return true
}
}
return false
}
}
您是否必须使数组扩展的项也符合equalable:扩展数组
?您的方法将仅适用于equalable元素的数组,并且您不能在对模板更严格的泛型类型上编写方法。比较或其中一个应该符合“重复”的条件。谢谢@MartinR,我在那里找到了我的答案和错误。你知道Swift已经有了contains()
函数吗?请参阅。这应该是自Swift 4.2起接受的答案。谢谢您的帮助-我忘了您可以在扩展中使用元素
作为约束类型。