この記事では「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]
複数の配列の重複や合計を出す
Set
のintersect
を使うと重複要素、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