しめ鯖日記

swift, iPhoneアプリ開発, ruby on rails等のTipsや入門記事書いてます

Swift再入門5 − The Swift Programming Languageを読んでみる

この記事では「The Swift Programming Language」を1から読んだ感想とか発見を書いてみようと思います。
「The Swift Programming Language」とはSwiftの公式ドキュメントでiBooksや下ページで見る事ができます。

The Swift Programming Language: About Swift

読んだ所

今回はCollection Typesという項目を読みました。

The Swift Programming Language: Collection Types

学んだこと

Arrayのデフォルト値

Arrayではデフォルト値を入れる事ができます。
countでデフォルトの配列の個数、repeatedValueはデフォルトの値を入れます。
地味ですが便利そうな機能ですね。

[Double](count: 2, repeatedValue: 1.1) // → [1.1, 1.1]

複数のStruct型が混ざっているとNSArrayになる

かなりマニアックな条件なのですが、複数の型が混ざった状態で初期化をするとNSArrayになるようです。
下のように宣言したらarrはNSArrayになりました。
2種類の構造体(DoubleとStringは構造体)が混在しているとNSArrayになるようです。

let arr = [1.1, String(1)]

型の宣言も入れるとArray<AnyObject>になりました。

let arr: [AnyObject] = [Int(1), Double(1)]

下のようにクラスと構造体が混在している場合は宣言なしでもArray<AnyObject>になりました。

let arr = [UILabel(), Double(1)]

配列の加算

配列は下のように+で追加ができます。
-``*``/はできませんでした。

var arr = ["1", "2", "3"]
arr += ["4"]

配列への要素のセット

配列は下のように複数の要素をセットする事ができます。

var arr = ["1", "2", "3", "4"]
arr[1...2] = ["5", "6"]
print(arr) // → [1, 5, 6, 4]

代入する要素の数は多かったり少なかったりしても大丈夫なようです。

var arr = ["1", "2", "3", "4"]
arr[1...2] = ["5"]
print(arr) // → [1, 5, 4]

arr = ["1", "2", "3", "4"]
arr[1...2] = ["5", "6", "7"]
print(arr) // → [1, 5, 6, 7, 4]

存在しない要素にアクセスしようとするとArray index out of rangeになります。

var arr = ["1", "2", "3", "4"]
arr[1...10] = ["5", "6", "7"] // → Array index out of rangeエラー

Arrayのfor inでIndexを取得する

for-inでIndexも同時に取りたい場合はenumerateします。

for (index, value) in ["A", "B", "C"].enumerate() {
    print("\(index): \(value)")
}

Set型の特徴

使われる頻度は少ないですがSwiftにはSet型というものがあります。

  • 並び順を保証しない
  • 重複を許可しない

Set型の並び順

実際に下のようにIndexを調べたら宣言時とは違う順番になりました。

let set: Set = [1, 2, 3]

print(set.indexOf(1)!) // → 2
print(set.indexOf(2)!) // → 0
print(set.indexOf(3)!) // → 1

for-inで取り出した場合も宣言時とは違う順番になっていました。

let set: Set = [1, 2, 3]
for value in set {
    print(value) // → 2, 3, 1
}

配列の重複を削除する

Set型を使うと配列の重複を削除できます。
ただし並び順が保証されない点は注意が必要です。

let arr = [1, 2, 3, 1]
print(arr) // → [1, 2, 3, 1]
print(Array(Set(arr))) // → [2, 3, 1]

複数の配列の重複や合計を出す

Setintersectを使うと重複要素、unionを使うと全部の要素を取得できます。
地味ですが覚えておくと便利そうですね。

print(Set([1, 2, 3]).intersect(Set([2, 3, 4]))) // → 2, 3
print(Set([1, 2, 3]).union(Set([2, 3, 4]))) // → 1, 2, 3, 4

他にも、このSetは別Setの部分集合かを取得できます。

print(Set([1, 2, 3]).isSubsetOf(Set([1, 2, 3, 4]))) // → true