SwiftにおけるArrayとSetの違い

Array

An ordered, random-access collection

https://developer.apple.com/documentation/swift/array

特徴

  1. 配列の要素は順序立てられている
  2. 配列の要素は重複可能
  3. 配列の要素は複数の型を保持可能

random-access collectionとあるのは、ArrayがRandomAccessCollection protocolに準拠しているためであり、要素に対してランダムに取り出されるわけではない

コードサンプル

上記特徴を踏まえ、どのような挙動となるのか見ていきます
let numbers = [2, 5, 3, 5]
print(numbers)
print(type(of: numbers))
numbers.forEach { print($0) }

// 実行結果
[2, 5, 3, 5]
Array<Int>
2
5
3
5
実行結果を見ると、numbersに追加された要素順に取り出されていることがわかります。
let numbers: [Any] = [2, "test", 0.5]
print(numbers)
print(type(of: numbers))
numbers.forEach { print($0) }

// 実行結果
[2, "test", 0.5]
Array<Any>
2
test
0.5
[Any] typeとすることで、複数の型を保持することができます https://developer.apple.com/documentation/swift/randomaccesscollection

Set

An unordered collection of unique elements.
https://developer.apple.com/documentation/swift/set

特徴

  1. 配列の要素は順序立てられていない
  2. 配列の要素はユニーク
  3. 配列の要素は複数の型を保持できない

コードサンプル

上記特徴を踏まえ、どのような挙動となるのか見ていきます
let numbers: Set = [2, 3, 4, 3]
print(numbers)
print(type(of: numbers))
numbers.forEach { print($0) }

// 実行結果
[4, 3, 2]
Set<Int>
4
3
2
型定義時に Set を指定しないと、Arrayになることに注意。
また、3が重複していますが、runtime errorにはならず、ユニーク性を担保していることがわかります。
forEachで取り出す際には、初期化時の順序とは異なりランダムに取り出されています。
let numbers: Set = [2, "test"] // compile error
print(numbers)
print(type(of: numbers))
numbers.forEach { print($0) }
Setでは、複数の型を保持しようとするとcompile errorとなります。
上記では、Intが先に追加されているにも関わらずStringを追加しようとしているため、 Cannot convert value of type 'String' to expected element type 'Int' というエラーメッセージが表示されます

まとめ

ArrayとSetの違いについて簡単にまとめていきました。
要件に応じてどちらを利用するのか、また利用すべきか検討するとよりSwiftyなコードとなると思うので、違いについて把握しておくと良いと思います
最新情報をチェックしよう!