2016-06-01 81 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

我不是故意傷害任何人。我將不勝感激如果有任何觀察/建議改善:) –