The Swift Programming Language をまとめるトップ
Collection Types(集合型、Array とか Dictionary)
Array と Dictionary の二種類の Collection Type を扱う
Swift は何れの型を正しく評価し開発時にエラーとして分かる
Arrays (配列)
同じ値を何度も保持できる
どんなオブジェクトでも保持できる
Array Type Shorthand Syntax(基本シンタックス)
Array<型> で明示的にしていできる
型[] を使った書き方もある <ーこっちが preferred らしい
Array Literals(配列リテラル)
Shorthand なやりかたは、角括弧[] で括る
[値1, 値2, 値3]
以下は、"買い物リスト" に String の値を指定して配列を生成している
var 買い物リスト: String[] = ["卵", "牛乳"]
"買い物リスト" は "文字列集合配列" として宣言され、配列値に文字列のみを許可する
NOTE
可変長として扱いたいので var で宣言している
Swift には type inference (推論機能)があるので、以下のようにも書け、以下の場合は、文字列のみ許可される
var 買い物リスト = ["卵", "牛乳"]
Accessing and Modifying an Array(配列操作・変更)
メソッドとプロパティを使って操作・変更ができる
count
配列の要素数を数える
println("買い物リストにある個数は \(買い物リスト.count) 個.")
isEmpty
count property が 0 のショートカット
if 買い物リスト.isEmpty {
println("買い物リストは空です")
}
append または (+=)
要素を追加
買い物リスト.append("小麦粉")
買い物リスト += "ベーキングパウダー"
買い物リスト += ["チーズ", "バター"]
最初の値
var firstItem = shoppingList[0]
// firstItem は 卵
最初の値を更新する場合
firstItem[0] = "卵6個"
以下みたいな書き方も
買い物リスト[6...8] = ["バナナ", "リンゴ"]
// "買い物リスト" が 7アイテムに
insert を使って追加
買い物リスト.insert("シロップ", atIndex:0)
// "買い物リスト" が 9アイテムになる
// シロップが最初の値になる
removeAtIndex を使って削除
戻り値は削除したアイテム
let シロップ = 買い物リスト.removeAtIndex(0)
// 削除したアイテムが戻り値で買い物リストは 8アイテムになる
Iterating Over an Array(配列の展開、イテレート)
for-in loop でイテレートできる
for item in shoppingList {
println(item)
}
// 卵6個
// 牛乳
// 小麦粉
// ベーキングパウダー
// チーズ
// バター
// バナナ
// リンゴ
Creating and Initializing an Array (配列生成)
イニシャライザーを使って空の配列を生成することができる
var someInts = Int[]()
println("someInts は Int[] 型でアイテムは \(someInts.count) 個.")
// "someInts は Int[] 型でアイテムは 0 個."
Int[] が指定されているので、Int型の配列になる
someInt.append(3)
// someInt は数値の値一個保持している
someInts = []
// someInt は数値型で初期かされる
初期値の指定もできる
var threeDoubles = Double[](count: 3, repeatedValue: 0.0)
// threeDoubles は Double[]型で [0.0, 0.0, 0.0] になる
var anotherThreeDoubles = Array(count: 3, repeatedValue: 2.5)
// anotherThreeDoubles は Double[]とみなされ値は [2.5, 2.5, 2.5]
var sixDoubles = threeDoubles + anotherThreeDoubles
// sixDoubles は Dobule[]とみなされ値は [0.0, 0.0, 0.0, 2.5, 2.5, 2.5]
Dictionaries(ディクショナリ・連想配列)
ディクショナリに保持する要素の値は必ず型をもつ
明示的に指定したい推論を使ったりして型をセットする
Dictionary<キー型, 値型> となる
ObjCはどんなオブジェクトも保持する事ができた
Key型 は hashable でなければならない
String, Int, Double, Bool はデフォルトで hashable
Dictionary Literals (ディクショナリ・連想配列リテラル)
角括弧[] で以下のように括る
[キー1: 値1, キー2: 値2, キー3: 値3]
例えば
var airports: Dictionary<String, String> = ["TYO": "Tokyo", "DUB": "Dublin"]
上記は、明示的にキー型と値型をStringとしてイニシャライズ
var を使ってるので可変長(mutable)
推論を使って以下のようにも宣言できる
var airports = ["TYO": "Tokyo", "DUB": "Dublin"]
Accessing and Modifying a Dictionary(ディクショナリ・連想配列操作、更新)
count プロパティはリードオンリーで要素の数を返す
print("airportsディクショナリの要素は \(airports.count) です。")
// prints "airportsディクショナリの要素は 2 です。
新しくキーを追加
airports["LHR"] = "London"
キーの更新
airports["LHR"] = "London Heathrow"
updateValue(forKey:) を使うとキーが無い場合追加であるば場合更新
更新の場合は、更新前のオプショナル値を返す
例えば、戻り値が String の場合 String? を返す
if let oldValue = airports.updateValue("Dublin International", forKey: "DUB") {
println("DUB は \(oldValue) だった.")
}
// prints "DUB は Dublin だった."
キーの値はオプショナル値なので、以下のようにも書ける
if let airportName = airports["DUB"] {
println("空港の名前は \(airportName).")
} else {
println("空港コードは存在しなし.")
}
// prints "空港の名前は Dublin International."
nil を使って削除することもできる
airport["APL"] = "Apple Intenational"
// Apple Intenational は存在しないので、削除
airport["APL"] = nil
removeValueForKey を使うと削除した値が取得できる
無い場合 nil を返す
if let removedValue = airports.removeValueForKey("DUB") {
println("削除された空港 \(removedValue).")
} else {
println("DUBの値がディクショナリに存在していない")
}
// prints "削除された空港 Dublin International."
Iterating Over a Dictionary (ディクショナリ・連想配列展開、イテレート)
for-in loop で展開できて、tuple(key, value)を返す
for (airportCode, airportName) in airports {
println("\(airportCode): \(airportName)")
}
// TYO: Tokyo
// LHR: London Heathrow
keys プロパティでキーを返し values プロパティで値を返す
for airportCode in airports.keys {
println("Airport code: \(airportCode)")
}
// Airport code: TYO
// Airport code: LHR
for airportName in airports.values {
println("Airport name: \(airportName)")
}
// Airport name: Tokyo
// Airport name: London Heathrow
キーと値をそれぞれ配列に格納したい場合
let airportCodes = Array(airports.keys)
// airportCodes is ["TYO", "LHR"]
let airportNames = Array(airports.values)
// airportNames is ["Tokyo", "London Heathrow"]
NOTE
Dictionary のキーは順不同でキーの順序は展開するときに順序立つ
Creating an Empty Dictionary(ディクショナリ・連想配列生成)
var namesOfIntegers = Dictionary<Int, String>()
namesOfIntegers[16] = "siteen"
// namesOfInteger は 1つのキーと値のペアを保持
nameOfIntegers = [:]
// nameOfInteger は角括弧とコロンを使って初期化されて空の状態になる
Mutability of Collections (可変について)
-
Dictionary
-
定数の場合、キーも値もサイズも変更できない
-
Array
-
定数の場合、サイズは変更できないが値は変更できる
NOTE
基本 immutable を使って、可変の場合のみ mutable にする方が優しい