Swift言語ガイド 第4章 コレクション型
配列
- 配列は同じ型での値の順序付きコレクションである。
- 配列の型は
Array<型>
と書くか、または省略形で[型]
と書く。省略形の方が好ましい。
var arraySample1: Array<String>
var arraySample2: [ String ] - 配列リテラルは
[ 値1, 値2, 値3 ]
のようにコンマで区切り、大かっこで囲んで書く。
var shoppingList = [ "卵", "牛乳" ] - 配列の要素数を調べるには
count
プロパティを使う(リードオンリー)。
println( "買い物リストには買う物が \( shoppingList.count ) 個ある。" ) - 配列が空かどうかを調べるには、
isEmpty
プロパティを使う(Boolean)。
if shoppingList.isEmpty {
println( "買い物はない。" )
} else {
println( "買い物が必要。" )
} - 配列の最後に要素を加えるには
append
メソッドを使う。+=
も使える。これだと1度に複数の要素を加えられる。
shoppingList.append( "小麦粉" )
shoppingList += [ "ベーキングパウダー", "バター","チーズ", "チョコレート" ] - 配列の要素を参照するには配列名の直後に
[ 添字 ]
を付ける。これを添字記法と呼ぶ。
var firstItem = shoppingList[ 0 ] - 配列の最初の要素の添字は
0
である。 - 配列の要素を変えるのも添字記法でできる。
shoppingList[ 0 ] = "卵6個" - 1度に複数の要素を変えるには範囲演算子
...
が使える。変更される要素数と変更する要素数が異なってもかまわない。
shoppingList[ 4...6 ] = [ "バナナ", "りんご" ] - 配列の最後に要素を加えるのには添字記法は使えない。
- 配列の要素数を超えて参照や代入をしようとするとランタイムエラーになる。
- 配列の特定の添字の所に値を挿入するには
insert( atIndex: )
メソッドを使う。
shoppingList.insert( "メイプルシロップ", atIndex: 0 ) - 配列から特定の添字の所の要素を削除するには
remove( 添字 )
メソッドを使う。このメソッドは、戻り値として配列を返すのではなく、削除した要素を返すので注意。要素を削除した場合、ギャップは前に詰められるので、その要素の後ろの要素が前にずれることになる。
let mapleSyrup = shoppingList.removeAtIndex( 0 )
println( shoppinglist[ 0 ] ) - 配列の最後の要素を削除する場合には removeLast メソッドを使う。
let apples = shoppingList.removeLast() - 配列全体に繰り返し処理をするには
for-in
ループが使える。もし配列の値だけでなく、添字も必要なのであれば、グローバル関数enumerate
が使える。enumerate
関数は、配列の個々の要素の添字と値のタプルを返す関数である。
for item in shoppingList {
println( item )
}
for ( index, value ) enumerate( shoppingList ) {
println( \( index + 1 ) 個目は \( value ) )
} - 要素が空の配列を作るには、イニシャライザ記法が使える。すでに型がわかっている場合は型名を省略できる。
var someInts = [ Int ]()someInts.append( 3 )
someInts = [] - 幾つかの要素に同じ値を入れて初期化した配列を作るには
count
とrepeatedValue
を使って書くことができる。
var threeDoubles = [ Double ]( count: 3, repeatedValue: 0.0 ) - 2つの型コンパチな配列を
+
を使って合成して一つの配列を作ることもできる。新しい配列の型は推論される。
anotherThreeDoubles = [ Double ]( count: 3, repeatedValue: 2.5 )
var sixDoubles = threeDoubles + anotherThreeDoubles
ディクショナリ
- ディクショナリは同じ型での値の順不定なコレクションである。違う型でもいい
NSDictionary
などとは異なるので注意。 - ディクショナリの値はユニークな識別子であるキーに関連付けられる。
- ディクショナリの型は
Dictionary< キーの型, 値の型 >
と書くか、省略形として[ キーの型: 値の型 ]
と書く。省略形の方が好ましい。 - ディクショナリのリテラルの一般形は
[ キー1: 値1, キー2: 値2, キー3: 値3 ]
のようなキーバリューペアである。リテラルを使えば、型宣言をする必要はほとんどない。
var airports = [ "HND": "羽田空港", "NRT": "成田空港" ] - ディクショナリを参照したり変更したりするには、メソッドやプロパティ、添字記法を用いる。配列と同様に使えるものは以下。
println( airports.count )
println( airports.isEmpty )
airports[ "KIX" ] = "関西空港" // 値の追加
airports[ "HND" ] = "東京国際空港" // 値の変更 - 代入や変更には
updateValue( forKey: )
も使えるが、これは古い(変更される前の)値を返すので注意のこと。
if let oldValue = airports.updateValue( "成田国際空港", forKey: "NRT" ) {
println( "\( oldValue ) は NRT の更新前の名前である。" ) // 「成田空港」が出力される。
} - 参照は添字記法でできるが、キーバリューペアが登録されていない場合でも参照はエラーにはしない。このため、戻り値は値の型の Optional 値となる。(なのでたぶん、参照時は if-let を使ったほうがいい。)
if let airportName = airports[ "KIX" ] {
println( "空港名は \( airportName )" )
} else {
println( "その空港は登録されていない。")
} - キーバリューペアの削除は、添字記法で nil を代入すればよい。
airports[ "APL" ] = "アップル国際空港"
airports[ "APL" ] = nil - 削除のもう一つの方法は、
removeValueForKey
を使う。この場合、Optional 的処理が必要なので注意のこと。
if let removedValue = airports.removeValueForKey( "NRT" )
println( "\( removedValue ) は削除された。" )
} else {
println( "そのような空港は登録されてない。")
} - ディクショナリの繰り返し処理でも
for-in
ループを使うと便利だが、回すのは( key, value )
となる。
for ( airportCode, airportName ) in airports {
println( "\( airportCode ): \( airportName )" )
} keys
プロパティとvalues
プロパティを使えば、キーだけ、値だけの配列を取り出すことができる。
let airportCodes = [ String ]( airports.keys )
let airportNames = [ String ]( airports.values )- 空のディクショナリを作るには、イニシャライザ記法を使う。配列と同様、すでに型がわかっている場合は、型を省略できる。
var namesOfIntegers = [ Int: String ]()
namesOfIntegers[ 16 ] = "sixteen"
namesOfIntegers = [:] - キーの型はハッシュ可能でなければならない。つまり、ハッシュ値を提供可能な型でなければならない。ハッシュ値は
hashValue
で計算できる。Swift のすべての基本型(String
,Int
,Double
,Bool
)はすべてハッシュ可能であるので、キーになり得る。また値が関連付けられていない Enumeration メンバーもデフォルトでハッシュ可能である。 - 自分で作ったカスタムの型も、Swift 標準ライブラリの
Hashable
プロトコルに準拠すれば、キーにすることができる。Hashable
プロトコル準拠は- hashValue という名前の Int 型プロパティが得られること。
- 等価比較演算子(
==
)を提供すること。
(第4章コレクション型終わり)