2017-01-23 2 views
1

によって `Collection`プロトコルが一意になります。任意のアイデアをどのように改善するのですか? (私はハードコードさWKBackForwardListItemurl一部を取り除くと、ちょうど任意のプロパティを受け入れる取得したいと思います)しかし、私は、これはまだ可能ではないかと思いますか? は、私がどんな成功せず、この拡張は、一般的な作成しようとしている要素のプロパティ

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プロトコルを失った、だったが、それはこの例でokです。

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を提供しているデータの順序を維持するために

。これは、順番Arrayが提供を維持しながらSetが提供する一意性を持っています。

こちらがお役に立てば幸いです。

+0

配列の順序を保持する必要があるため、 'Set'を使うことはできません:( – raulriera

+1

あなたは' NSOrderedSet'を探しています。 – naturaln0va

関連する問題