Swift Generics问题

时间:2014-06-04 09:46:46

标签: swift

现在我希望能够看到一个对象是否包含在Array中,所以:

func isIncluded<U:Comparable>(isIncluded : U) -> Bool
{
    for item in self
    {
        if (item == isIncluded)
        {
            return true
        }
    }

    return false
}

如果您发现此功能属于Array扩展程序。问题是如果将其添加到此:

extension Array{

}

我收到以下错误:

  

无法找到&#39; ==&#39;接受提供的参数

enter image description here

我知道我可能需要告诉Array内部应该包含哪类对象:T[] <T.GeneratorType.Element: Comparable>。但它也不起作用:

  

支持的陈述块是未使用的封闭件   非名义类型&#39; T []&#39;不能延长
  期待&#39; {&#39;在扩展

enter image description here

3 个答案:

答案 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)

不是说这是不可能的,但我还没有看到扩展结构或类的方法来为原始泛型设置条件,例如保证数组上的EquatableComparable 。但是,对于您的特定问题,您可以执行以下操作,而不是扩展:

var arr = [1, 2, 3]
var isIncluded : Bool = arr.bridgeToObjectiveC().doesContain(1)