如何将array.indexOf与协议一起使用?

时间:2016-06-01 05:49:38

标签: ios swift algorithm

var items = [LiveCellProtocol]() //unsorted array

public class User: LiveCellProtocol {
...
}

let mike = User()
items.append(mike)
items.indexOf(mike) //throws an error
  

无法将“LiveCellProtocol”类型的值转换为预期参数   类型'@noescape(LiveCellProtocol)throws - >布尔“

我该如何解决这个问题?我真的想使用方法.indexOf。这个问题有方法解决吗?

现在,我通过遍历每个项目来破解解决方案,这是线性时间。

2 个答案:

答案 0 :(得分:1)

为了能够在协议中使用indexOf,它必须是Equatable。使您的协议符合它,您将能够使用它。有关详细信息,请查看here

答案 1 :(得分:-1)

正如您在问题中所说,您对元素的线性访问感兴趣。我建议考虑使用有序数组(包含唯一项目)。

此结构提供具有对数复杂度的classdef方法。如果这有用,我们可以通过消除例如递归来优化它(更好地使用循环)。

indexOf

CLEINTS CODE:

public class OrderedArray<T: Comparable>
{
    var a = Array<T>()

    func append(item: T) {

        if let _ = indexOf(item) {
            //already exists
            return
        }
        a.append(item)
        a.sortInPlace()
    }

    func indexOf(item: T) -> Int? {

        //do logoriphmic search
        return searchItemIndex(item, start: 0, end: a.count - 1)
    }

    func searchItemIndex(item: T, start: Int, end: Int) -> Int? {

        if (start > end) {
            return nil
        }

        let m = (start + end) / 2

        if a[m] > item {

            return searchItemIndex(item, start: start, end: m - 1)
        } else if a[m] < item {

            return searchItemIndex(item, start: m + 1, end: end)
        } else {

            return m
        }
    }

    func objectAt(index: Int) -> T {

        return a[index]
    }

    var count: Int {

        return a.count
    }
}