2016-06-01 82 views
1
var items = [LiveCellProtocol]() //unsorted array 

public class User: LiveCellProtocol { 
... 
} 

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

类型的 'LiveCellProtocol' 值无法转换为期望的参数 型 '@noescape(LiveCellProtocol)抛出 - >布尔'如何在协议中使用array.indexOf?

我怎样才能解决这个问题?我真的想用.indexOf的方法。有针对这个的解决方法吗?

现在,我通过迭代每个项目来破解解决方案,而且它是线性时间。

+5

'的indexOf()'需要线性时间,以及... –

+0

@MartinR你确定的indexOf是线性的时间?我认为swift每个数组都有自己的地图? – TIMEX

+0

我很确定。数组不是字典。另见https://developer.apple.com/library/ios//documentation/Swift/Reference/Swift_CollectionType_Protocol/index.html#//apple_ref/swift/intf/s:Ps14CollectionType:'Complexity:O(self.count) 。' –

回答

2

为了能够在协议中使用indexOf,它必须是Equatable。遵守你的协议,你就可以使用它。欲了解更多信息,请看看here

-1

正如您在问题中所述,您比线性访问元素更感兴趣。我会建议考虑下面的有序数组(具有独特的项目)。

该结构提供了具有对数复杂度的indexOf方法。如果这很有帮助,我们可以通过消除递归来优化这个例子(最好使用循环代替)。

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 
    } 
} 

CLEINTS CODE:

public func ==(lhs: User, rhs: User) -> Bool { 

    return lhs.id == rhs.id 
} 

public func <(lhs: User, rhs: User) -> Bool { 
    return lhs.id < rhs.id 
} 

public func >(lhs: User, rhs: User) -> Bool { 
    return lhs.id > rhs.id 
} 

public func <=(lhs: User, rhs: User) -> Bool { 
    return lhs.id <= rhs.id 
} 

public func >=(lhs: User, rhs: User) -> Bool { 
    return lhs.id >= rhs.id 
} 

public class User: Comparable { 

    var id: Int 

    init(id: Int) { 
     self.id = id 
    } 
} 


var users = OrderedArray<User>() 

let mike = User(id: 1) 
let john = User(id: 2) 
let ash = User(id: 3) 
let sam = User(id: 4) 
let lens = User(id: 5) 


users.append(mike) 
users.append(ash) 
users.append(john) 
users.append(mike) 
users.append(lens) 

if let index = users.indexOf(lens) { 
    print("User with id found: \(users.objectAt(index).id)") 
} else { 
    print("User not found") 
} 
+0

我不是故意伤害任何人。我将不胜感激如果有任何观察/建议改善:) –