Learn Swift / viva Cocoa


Learn Swift / 第11章  コレクション


このコーナーでは、Swift による、Mac OS X アプリケーションの作成方法を、説明しています。

2016年1月19日

home  目次  前へ  次へ  mail


コレクション

 ある目的のための、複数のデータを、一つにまとめたものが、コレクション (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.count

 cities.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)


お疲れ様でした。

 次章では、構造体を学習します。構造体は、クラスと同じように、型の違う複数の値と、関数を持てます。


home  目次  前へ  次へ  mail


無断転載禁止
Copyright 2016. vivacocoa.jp All right reserved.