読者です 読者をやめる 読者になる 読者になる

Swiftで配列にuniqをかけるやつ

タイトル通り。 メソッド名は標準のsortInPlaceに合わせた感じにした。

一応使い方

// 引数なし版

var numbers = [1, 2, 3, 2, 3, 4]

let uniqHoges = numbers.uniq()
print(uniqHoges)
// => [1, 2, 3, 4]

print(numbers)
// => [1, 2, 3, 2, 3, 4]

numbers.uniqInPlace()
print(numbers)
// => [1, 2, 3, 4]


// 引数に変換関数を渡す版

struct Fuga {
    let id:  String
    let foo: Int
}

var fugas = [
    Fuga(id: "a", foo: 1),
    Fuga(id: "b", foo: 1),
    Fuga(id: "a", foo: 2)
]

let uniqFugas = fugas.uniqBy { $0.id }
print(uniqFugas)
// => [Fuga(id: "a", foo: 1), Fuga(id: "b", foo: 1)]

print(fugas)
// => [Fuga(id: "a", foo: 1), Fuga(id: "b", foo: 1), Fuga(id: "a", foo: 2)]

fugas.uniqInPlaceBy { $0.id }
print(fugas)
// => [Fuga(id: "a", foo: 1), Fuga(id: "b", foo: 1)]

追記

そういえば、NSOrderedSetに変換してからArrayに戻すスタイルでも実装できる。 どっちが効率良いのかは見ていない。