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
。这个问题有方法解决吗?
现在,我通过遍历每个项目来破解解决方案,这是线性时间。
答案 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
}
}