2016-06-01 3 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) -> BOOL'프로토콜과 함께 array.indexOf를 어떻게 사용할 수 있습니까?

가 어떻게이 문제를 해결할 수 있습니까? 나는 정말로 방법 .indexOf을 사용하고 싶다. 이것에 대한 해결책이 있습니까?

지금 당장은 모든 항목을 반복 해 솔루션을 해킹하고 있습니다. 선형 시간입니다.

+5

'같이 IndexOf()는' –

+0

@MartinR 당신은 같이 IndexOf 선형 시간입니다 확신합니다 ...뿐만 아니라 선형 시간이 필요합니다? 스위프트는 각 어레이에 대해 자체 맵을 가지고 있다고 생각했습니다. – 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 코드 :

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

나는 이것으로 아무도 다칠 뜻이 아니었다. 나는 어떤 관찰/개선을위한 제안이 있다면 감사하겠습니다 :) –

관련 문제