2017-01-23 1 views
1

나는이 확장 기능을 아무런 성공없이 일반화하려고 노력해 왔습니다. 어떤 아이디어를 개선하는 방법? (나는 하드 코드 된 WKBackForwardListItemurl 부분을 없애고 모든 속성을 허용하고 싶습니다.) 그러나 이것은 아직 가능하지 않습니다. `Collection` 프로토콜을 Element 속성으로 고유하게 만듭니다.

extension Collection where Iterator.Element: WKBackForwardListItem { 
    func unique() -> [Iterator.Element] { 
     var seen: [Iterator.Element] = [] 

     for element in self { 
      if seen.map({ $0.url }).contains(element.url) == false { 
       seen.append(element) 
      } 
     } 

     return seen 
    } 
} 

이상적으로 서명 배열, WKWebView 역사의 성격을 감안할 때이

func unique(by property: Property) -> [Iterator.Element] { 

업데이트

처럼 종료됩니다. 배열의 순서를 유지하는 것은 매우 중요합니다. 따라서 Set을 사용할 때마다 의문의 여지가 없습니다.

업데이트 2

결과 코드 내가 Collection 프로토콜을 잃었습니다,하지만이 예를 들어 괜찮습니다.

extension Array where Iterator.Element: Equatable, Iterator.Element: Hashable { 
    func unique() -> [Iterator.Element] { 
     return NSOrderedSet(array: self).array as! [Iterator.Element] 
    } 
} 

고마워요!

+0

속성에 의존하기 때문에'where'를 사용하여 요소 유형을 지정해야합니다. 단순히'Set'에 데이터를 로딩하고'contains'를 사용하는 것이 코드보다 효율적입니다. O (n2) – Paulw11

+0

이 함수는 정확히 무엇을해야할까요? 원하는 출력을 이해할 수 없다고 생각합니다. 구체적으로'seen.map ({$ 0.url}) '은 의미가 없습니다. '보았던'사람들은 어떻게 채워 집니까? 아니면'seen.map'는 매번 빈 배열을 반환하기로되어 있습니까? –

+0

메서드에 대한 인수로 * closure * (컬렉션 요소를 속성에 매핑)를 전달합니다. –

답변

1

NSOrderedSet (및 NSMutableOrderedSet)을 찾고 있습니다. 그것은 Array의 주문과 함께 Set의 유일성을 가지고 있습니다! See Apple's documentation.

2

이 확장자는 Collection 일 필요는 없습니다. 필요한 것은 Set입니다. 확인해야 할 것은 배열의 항목이 Equatable 프로토콜을 따르는 것입니다.

샘플 :

let food = ["taco", "apple", "pizza", "taco"] 
let uniqueFood = Set(food) // ["taco", "apple", "hot dog"] 

그런 다음 당신이해야 할 모든 것을 Set에서 Array을 만들 수있다 : 사용 사례 WKBackForwardListItem를 들어

let foodArray = Array() 

Equatable을 준수 않습니다 그래서 당신이 필요가 없습니다 그 일을 위해 특별한 일을하십시오.

귀하의 데이터 순서를 유지하기 위해 Apple은 NSOrderedSet을 제공했습니다. 이것은 Set가 제공하는 유일성을 가지고 있으며, 주문을 유지하면서 Array이 제공합니다.

이 정보가 도움이되기를 바랍니다.

+0

배열의 순서를 유지해야하기 때문에'Set'을 사용할 수 없습니다 : ( – raulriera

+1

언급 한 andyvn22처럼'NSOrderedSet'을 찾고 있습니다. – naturaln0va

관련 문제