Learn Swift / 第11章 コレクション
このコーナーでは、Swift による、Mac OS X アプリケーションの作成方法を、説明しています。
コレクション
ある目的のための、複数のデータを、一つにまとめたものが、コレクション (collection) です。
Swift には、配列、辞書、タプルというコレクションが用意されています。
配列
配列 (Array) は、データを順番で、管理しています。
import Cocoa let cities:[String] = ["札幌", "仙台", "東京", "名古屋", "大阪", "岡山", "博多"] for index in 0..<cities.count { print(cities[index], terminator:"、") }このリストを実行すると、デバッグエリアに、「札幌、仙台、東京、名古屋、大阪、岡山、博多、」と、一行で表示されます。
let cities:[String] = ["札幌", "仙台", "東京", "名古屋", "大阪", "岡山", "博多"]配列の型は、[ ] で囲んで指定します。型を指定せずに、
let cities = ["札幌", "仙台", "東京", "名古屋", "大阪", "岡山", "博多"]と、記述しても、型推論されるので、問題は生じません。
for index in 0..<cities.countcities.count で、cities 配列のデータの数を取得しています。count は、配列クラスに用意されているメソッドです。
..<範囲を指定する場合、..< と記述すると、最後の範囲の一つ手前までが指定されます。最後の範囲は含まれません。cities.count で、取得できるのは、配列に含まれるエレメント (element、要素) の数、つまりデータの数ですが、配列の要素に与えらる番号は、0 から始まります。つまり、最後の要素の番号は、要素の数よりも一つ少ない番号になります。
print(cities[index]・・・)配列の要素を取得するには、配列名[番号]で取得します。要素の番号は、0 から始まっています。
print(・・・, terminator:"、")print 関数には、第2引数の terminator を記述することができます。通常、print 関数は、デバッグエリアに文字列を出力して、改行をします。それは、デフォルトで、この terminator 引数に、改行を意味する "\n" が指定されているからです。この第2引数 terminator に、違う値を指定すると、改行せずに、一行で、文字を出力します。
要素の変更
要素の値を変更するには、配列名[番号] = 値 と、記述します。
cities[5] = "山口" と、記述すると、6番目の要素が「岡山」から「山口」に変更されます。なお、配列を let で定義していた場合は、要素の変更はできません。
import Cocoa var cities:[String] = ["札幌", "仙台", "東京", "名古屋", "大阪", "岡山", "博多"] cities[5] = "山口" for index in 0..<cities.count { print(cities[index], terminator:"、") }配列の末尾に、新しい要素を追加するには、配列.append("値") と、記述します。
import Cocoa var cities:[String] = ["札幌", "仙台", "東京", "名古屋", "大阪", "岡山", "博多"] cities.append("那覇") for index in 0..<cities.count { print(cities[index], terminator:"、") }任意の位置に、新しい要素を追加するには、配列.insert("値", atIndex: 位置の番号) と、記述します。
新しい要素が、指定された番号の位置に挿入され、今までそこにあった要素は、一つ後ろにずらされます。
import Cocoa var cities:[String] = ["札幌", "仙台", "東京", "名古屋", "大阪", "岡山", "博多"] cities.insert("山口", atIndex: 6) for index in 0..<cities.count { print(cities[index], terminator:"、") }任意の位置の要素を、削除するには、配列.removeAtIndex(位置の番号) と、記述します。
import Cocoa var numbers:[Int] = [100, 101, 102, 103, 104, 105] numbers.removeAtIndex(4) for index in 0..<numbers.count { print(numbers[index], terminator:"、") }配列の最初の要素を、削除するには、配列.removeFirst() と、記述します。
配列の最後の要素を、削除するには、配列.removeLast() と、記述します。
配列のすべての要素を、削除するには、配列.removeAll() と、記述します。
配列のすべての要素を削除しても、配列自体は無くなりません。空の配列 [ ] として残ります。
辞書
辞書 (Dictionary) は、キー (key) と呼ばれる「見出し」で、要素を管理しているコレクションです。
次のリストを実行した結果は、「理科の点数は、Optional(60)点です」と表示されます。
import Cocoa var grades:[String:Int] = ["国語":90, "数学":80, "英語":70, "理科":60, "社会":80] print("理科の点数は、\(grades["理科"])点です")var grades:[String:Int]辞書の型は、キーと値 (value、バリュー) のペアを、: (colon、コロン) で繋げて、[ ] で囲みます。
= ["国語":90, "数学":80, "英語":70, "理科":60, "社会":80]キーと値を組み合わせることによって、何の値であるかが、分かりやすくなります。
print("理科の点数は、\(grades["理科"])点です")辞書の値を取得するには、辞書[キー] と、記述します。
オプショナル
さきほどのリストの実行結果は、「理科の点数は、Optional(60)点です」となりました。
Optional (オプショナル) は、その値が、「無」であるかもしれない可能性を表しています。「無」は、値がまったく存在しないという意味です。Swift では、無」を「nil」と表記します。ためしに、さきほどのリストを、次のように変更してみてください。
import Cocoa var grades:[String:Int] = ["国語":90, "数学":80, "英語":70, "理科":60, "社会":80] print("物理の点数は、\(grades["物理"])点です")デバッグエリアに、「物理の点数は、nil点です」と表示されます。grades 辞書には、"物理" という要素がないからです。
このように、辞書というコレクションは、nil という値を持てます。一方、先に学習した配列は、nil という値は持てません。配列に対して、存在しない要素を指定すると、その時点で、プログラムはエラーを起こして、止まります。
しかし、デバッグエリアに "Optional(60)" と表示されるのは困ります。そこで、このデータを、nil を持てないデータに変更します。変更方法は簡単です。データの後に ! (exclamation、感嘆符) をつけるだけです。
import Cocoa var grades:[String:Int] = ["国語":90, "数学":80, "英語":70, "理科":60, "社会":80] print("理科の点数は、\(grades["理科"]!)点です")デバッグエリアに、「理科の点数は、60点です」と、表示されます。
要素の変更
辞書の要素の値を、変更するには、辞書[キー] = 値 と、記述します。
import Cocoa var grades:[String:Int] = ["国語":90, "数学":80, "英語":70, "理科":60, "社会":80] grades["理科"] = 100 print("理科の点数は、\(grades["理科"]!)点です")新しい要素を追加するには、辞書[新しいキー] = 値 と、記述します。
辞書には、順序という概念がありませんので、配列に比べて、追加は簡単です。
import Cocoa var grades:[String:Int] = ["国語":90, "数学":80, "英語":70, "理科":60, "社会":80] grades["体育"] = 70 print("体育の点数は、\(grades["体育"]!)点です")辞書の要素を削除するには、辞書[キー] = nil と、記述します。
次のリストの実行結果は、「社会の点数は、nilです」と、表示されます。
存在しない値を取得する場合には、! (exclamation、感嘆符) をつけません。! をつけると、エラーになります。オプショナルでない普通のデータは、nil (存在しない) を保持できないからです。
import Cocoa var grades:[String:Int] = ["国語":90, "数学":80, "英語":70, "理科":60, "社会":80] grades["社会"] = nil print("社会の点数は、\(grades["社会"])です")要素を削除するには、辞書.removeValueForKey(キー) メソッドも使えます。このメソッドは、戻り値として、削除した要素の値を返します。
次のリストの実行結果は、
国語の値は、90でしたとなります。"国語"要素は、削除されています。
["数学": 80, "英語": 70, "社会": 80, "理科": 60]
import Cocoa var grades:[String:Int] = ["国語":90, "数学":80, "英語":70, "理科":60, "社会":80] let key = "国語" let value = grades.removeValueForKey(key)! print("\(key)の値は、\(value)でした") print(grades)辞書のすべての要素を、削除するには、辞書.removeAll() と、記述します。辞書は、要素のない、空の辞書になります。辞書自体が、なくなったわけではありません。
import Cocoa var grades:[String:Int] = ["国語":90, "数学":80, "英語":70, "理科":60, "社会":80] grades.removeAll() print(grades) grades["化学"] = 70 print(grades)実行結果は、次のようになります。
[:]
["化学": 70]
タプル
タプル (tuple) は、型の違う複数の値を、一つにまとめることができます。
配列や辞書は、同じ型の要素でなければ持てませんでした。
タプルは、要素の値を変更できます。しかし、要素の追加や、削除はできません。
配列や辞書は、要素の追加や、削除ができました。
import Cocoa var tuple:(String, Int) = ("Hello", 100) print(tuple) print(tuple.0) print(tuple.1) tuple.0 = "Bye" tuple.1 = 200 print(tuple)このリストを実行すると、デバッグエリアに次のように表示されます。
("Hello", 100)
Hello
100
("Bye", 200)
お疲れ様でした。
次章では、構造体を学習します。構造体は、クラスと同じように、型の違う複数の値と、関数を持てます。
無断転載禁止 Copyright 2016. vivacocoa.jp All right reserved.