2016-06-01 10 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: '複雑さ: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

私はこれで誰かを傷つけるつもりはなかった。改善のための観察/示唆があれば感謝します:) –

関連する問題