现在我希望能够看到一个对象是否包含在Array
中,所以:
func isIncluded<U:Comparable>(isIncluded : U) -> Bool
{
for item in self
{
if (item == isIncluded)
{
return true
}
}
return false
}
如果您发现此功能属于Array
扩展程序。问题是如果将其添加到此:
extension Array{
}
我收到以下错误:
无法找到&#39; ==&#39;接受提供的参数
我知道我可能需要告诉Array
内部应该包含哪类对象:T[] <T.GeneratorType.Element: Comparable>
。但它也不起作用:
支持的陈述块是未使用的封闭件 非名义类型&#39; T []&#39;不能延长
期待&#39; {&#39;在扩展
答案 0 :(得分:8)
使用Swift,我们需要考虑是否有功能可以解决这个问题 - 在类的方法之外。
就像我们的情况一样:
contains(theArray, theItem)
你可以在操场上试试:
let a = [1, 2, 3, 4, 5]
contains(a, 3)
contains(a, 6)
我通过cmd单击Swift符号(例如: Array )然后查看该文件(它似乎是包含所有声明的全局文件)来发现很多这些函数Swift通用类和函数)。
这是一个小扩展,它将添加&#34;包含&#34;所有数组的方法:
extension Array {
func contains<T: Equatable>(item: T) -> Bool {
for i in self {
if item == (i as T) { return true }
}
return false
}
}
答案 1 :(得分:3)
要添加,问题是T已经定义,并且数组的T定义不符合Equatable。您可以通过投射(,如接受的答案)来完成您想要的任务,并冒失败的演员阵容,或者您可以传入不需要投射的委托。
考虑修改如下:
extension Array {
func contains(comparator: (T)->Bool) -> Bool {
for item in self {
if comparator(item) {
return true
}
}
return false
}
}
使用示例:
class Test {
func arrayContains(){
var test: Int[] = [0,1,3,4,5]
//should be true
var exists = test.contains({(item)->Bool in item == 0});
}
}
答案 2 :(得分:2)
不是说这是不可能的,但我还没有看到扩展结构或类的方法来为原始泛型设置条件,例如保证数组上的Equatable
或Comparable
。但是,对于您的特定问题,您可以执行以下操作,而不是扩展:
var arr = [1, 2, 3]
var isIncluded : Bool = arr.bridgeToObjectiveC().doesContain(1)