[Swift] Array と Set の相互変換

Swift

Swift の Array と Set の変換方法が、直感的すぎて すぐに忘れるので、メモ

環境&対象

以下の環境で動作確認を行なっています。

  • macOS Monterery beta 5
  • Xcode 13 beta5
  • iOS 15 beta

Set と Array

Set と Array は、いずれも要素の集合を表します。

大きな特徴の1つに、順序を保持するかどうかがあります。Array は、要素を順序づけて保持しますが、Set は順序をつけません。

ユーザーへ要素を表示する時に、順序が大切なケースでは、Array を使って、データを保持することで、前回表示した時の順序を再現することができるので Array を使うのが便利です。

Set には、そのような順序づけは持たせられませんが、同一の要素は Set 内に 1つしか存在しないことが保証されます。

内部処理向けに使う時に、”同一要素は高々1つ” という条件は便利な時があるので、そのような前提をつけて処理したい時には、Set を使うのが便利です。

Set と Array の相互変換

Array, Set いずれも それぞれに便利なユースケースがあるので、相互にやりとりする必要が発生します。

Set から Array への変換

Array には、Sequence 型を受けっとって、Array を生成する initializer があります。
Apple のドキュメントは、こちら

Set は Sequence 型でもありますので、以下のようにすると、Set が Array に変換されます.


import Foundation

let mySet:Set = [1,3,2,5]
let myArray = Array(mySet)

print(mySet)
print(myArray)

// print-out
[2, 3, 5, 1]
[2, 3, 5, 1]

Array から Set への変換

Set にも、Sequence 型を受けっとって、Set を生成する initializer があります。
Apple のドキュメントは、こちら

Array も Sequence 型ですので、以下のようにすると、Array が Set に変換されます。


import Foundation

let myArray = [1,3,2,5]
let mySet = Set(myArray)

print(myArray)
print(mySet)

// print-out
[1, 3, 2, 5]
[5, 3, 1, 2]
MEMO
Array は要素の順番を保持しているのと比較して、Set は、要素の順番を保持していないことがわかります。

Set から Array へ: 注意事項

Set には、同一要素は高々1つ という条件がありますので、同一要素を複数保持する Array を Set に変換すると内容が調整された Array が作成されます。


import Foundation

let myArray = [1,3,2,5,1]
let mySet = Set(myArray)

print(myArray)
print(mySet)

// print-out
[1, 3, 2, 5, 1]
[3, 5, 2, 1]
MEMO
Array には、1 が2つありましたが、Set には、1 が1つのみ保持されていることがわかります。

まとめ:Array と Set の相互変換

Array と Set の相互変換
  • Array(mySet) で Array に変換される
  • Set(myArray) で Set に変換される
  • Set は 要素の順序を保持しないので、気をつける
  • Array に複数の同一要素が入っている場合は、1つになった Set が作成される

説明は以上です。
不明な点やおかしな点ありましたら、こちらまで。

Swift 学習におすすめの本

詳解Swift

Swift の学習には、詳解 Swift という書籍が、おすすめです。

著者は、Swift の初期から書籍を出していますし、Swift の前に主力言語だった Objective-C という言語についても同様の書籍を出しています。

最新版を購入するのがおすすめです。

現時点では、上記の Swift 5 に対応した第5版が最新版です。

Swift ポケットリファレンス

Swift を学んでも、プログラミング言語の文法を全て記憶しておくことは無理なので、ちょっとした文法の確認をするために、リファレンス本を手元に置いておくと便利です。

注意
Swift4 までしか対応していないので、理解して参照する必要があります。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です