LoginSignup
10
9

More than 5 years have passed since last update.

Swift入門 勉強記録 その10 Collection

Last updated at Posted at 2014-09-25

 
・Swiftに関する他の記事はこちら
Swift入門 勉強記録 その1 Swiftとは、Playground起動

Swift入門 勉強記録 その2 変数、定数、文字列

Swift入門 勉強記録 その3 セミコロン

Swift入門 勉強記録 その4 数値、真偽値

Swift入門 勉強記録 その5 Tuple(組)とは

Swift入門 勉強記録 その6 数値を文字列とするには

Swift入門 勉強記録 その7 繰り返し

Swift入門 勉強記録 その8 条件分岐

Swift入門 勉強記録 その9 Optional型

Swift入門 勉強記録 その10 Collection
 

Array型

Array型は要素を順番に格納する。
作成方法はいくつかある。

ひとつは要素を[]でくくる。
要素はカンマで区切る。
下記のような書き方だ。

var array = [1,2,3,4,5]

要素へのアクセスは変数名[要素番号]である。
要素番号は0から始まる。

コードを書いて試す。

import UIKit

var array = [1,2,3,4,5]

println(array[0])

スクリーンショット 2014-09-24 00.52.32.png

配列に要素を追加するにはappend(要素)を使う。

import UIKit

var array = [1,2,3,4,5]
array.append(6)

println(array)

スクリーンショット 2014-09-24 01.01.42.png

配列の最後に6が追加されているのがわかると思う。

extend(範囲)を使うことで、まとめて追加することもできる。

import UIKit

var array = [1,2,3,4,5]
array.append(6)
array.extend(7...10)

println(array)

スクリーンショット 2014-09-24 01.05.22.png

次は配列に文字列として11を追加してみる。

import UIKit

var array = [1,2,3,4,5]
array.append(6)
array.extend(7...10)
array.append("11")

println(array)

Intじゃないと言われ、エラーになった。
ここ、Objective-Cで使っていたNSArray(NSMutableArray)と違う。
Objective-Cでは型は気にせず、配列に入れられる。
Swiftでは異なる型を配列に入れることはできないようだ。
記載した例では
 var array = [1,2,3,4,5]
で、型推測が行われ、配列の中身はInt型とされている。

スクリーンショット 2014-09-24 19.36.20.png

明示的に型を指定する方法がある。
ひとつは変数名の後ろに[]をつけて型を指定する。
 var array:[Int] = [1,2,3,4,5]

他にはgenericと呼ばれる方法だそうだが、
変数名の後ろにArrayとつける。
こんな感じだ。
 var array:Array = [1,2,3,4,5]
genericについては今後勉強することになるので、今は詳細は調べない。

NSArrayと同じように様々な型を入れられる配列を作ることはできる。
そのときは指定する型をAnyObjectとするのだ。
 var array:[AnyObject] = [1,"2",3,4,5]

エラーにならないか試してみる。

import UIKit

var array:[AnyObject] = [1,"2",3,4,5]
array.append("6")

println(array)

エラーならなかった。

スクリーンショット 2014-09-24 20.00.21.png

ちなみにSwiftでもNSArrayを使うことはできるが、
Swiftが安全性を追求しているとこを見ると
Array型を使っていくのがおすすめである。

Dictionary型

Array型は要素を順序づけて格納していた。
Dictionay型はキーと値を紐付けて、格納する。
値にアクセスするときはキーをもとにアクセスすることになる。

使い方は下記の通り。
 var dictionary = [1:"Father", 2:"Mother", 3:"me"]

[]の中に要素を追加していく。
:の前がキー、:の後ろが値である。
要素はカンマで区切るのだ。

import UIKit

var dictionary = [1:"Father", 2:"Mother", 3:"me"]

println(dictionary[1])

スクリーンショット 2014-09-24 20.25.16.png

コンソールにて、Optionalと出ている。
そこについては後述。

Dictionaryのキー、値の型には型推測が使われている。

Array型と同じように型を指定することができる。
変数名の後ろに[キーの型:値の型]をつける。
例えば、こんな感じだ。
 var dictionary:[Int:String] = [1:"Father", 2:"Mother", 3:"me"]

import UIKit

var dictionary:[Int:String] = [1:"Father", 2:"Mother", 3:"me"]
println(dictionary[1])

スクリーンショット 2014-09-24 20.35.07.png

Dictionaryに要素追加するのはこうやる。
 dictionary[4] = "brother"

import UIKit

var dictionary:[Int:String] = [1:"Father", 2:"Mother", 3:"me"]
dictionary[4] = "brother"
println(dictionary)

スクリーンショット 2014-09-24 20.38.50.png

変更もできる。

import UIKit

var dictionary:[Int:String] = [1:"Father", 2:"Mother", 3:"me"]
dictionary[4] = "brother"
dictionary[3] = "sister"

println(dictionary)

スクリーンショット 2014-09-24 20.47.18.png

削除は?

import UIKit

var dictionary:[Int:String] = [1:"Father", 2:"Mother", 3:"me"]
dictionary[4] = "brother"
dictionary[3] = "sister"
dictionary[1] = nil

println(dictionary)

スクリーンショット 2014-09-24 20.48.41.png

話は戻るが指定したキーの要素をコンソールに表示するとOptional型であった。

import UIKit

var dictionary:[Int:String] = [1:"Father", 2:"Mother", 3:"me"]
dictionary[4] = "brother"
dictionary[3] = "sister"
dictionary[1] = nil

println(dictionary[4])

スクリーンショット 2014-09-25 00.50.42.png

なぜか?
指定したキーの値はnilかもしれないからだ。
使うときにはunwrapしてあげよう。

こんな感じだ。

import UIKit

var dictionary:[Int:String] = [1:"Father", 2:"Mother", 3:"me"]
dictionary[4] = "brother"
dictionary[3] = "sister"
dictionary[1] = nil

if let value = dictionary[4]{
    println("\(value)")
}else{
    println("nilだった")
}

スクリーンショット 2014-09-25 0.56.56.png

参照とコピー

import UIKit

var dictionaryA = [1:1, 2:4, 3:9, 4:16]
var dictionaryB = dictionaryA
println(dictionaryA)
println(dictionaryB)

スクリーンショット 2014-09-25 1.05.30.png

dictionaryAとdictionaryBは同じだ。

import UIKit

var dictionaryA = [1:1, 2:4, 3:9, 4:16]
var dictionaryB = dictionaryA
println(dictionaryA)
println(dictionaryB)

// dictionaryBから要素を削除
dictionaryB[4] = nil
println(dictionaryA)
println(dictionaryB)

// ⇒ dictionaryAの要素は削除されていない

dictionaryBはdictionaryAの参照ではない。
dictionaryBはdictionaryAをコピーされたのだ。

Array型についても同様だ。

import UIKit

var dictionaryA = [1:1, 2:4, 3:9, 4:16]
var dictionaryB = dictionaryA
println(dictionaryA)
println(dictionaryB)

// dictionaryBから要素を削除
dictionaryB[4] = nil
println(dictionaryA)
println(dictionaryB)

// ⇒ dictionaryAの要素は削除されていない


/*  今の話の部分  */
// arrayBにArrayAを入れる
var arrayA = [1,2,3,4,5]
var arrayB = arrayA

println(arrayA)
println(arrayB)

// ⇒ arrayAとArrayBが出力した内容は同じだ

// arrayBの0番目の要素を削除
arrayB.removeAtIndex(0)

println(arrayA)
println(arrayB)

// ⇒ arrayAとarrayBで異なる内容が出力された
//   Array型もDictionary型と同様にコピーするのだ

スクリーンショット 2014-09-25 20.16.32.png

コピーなのはDictionary型とArray型で、
Objective-Cで使われたNSDitionaryやNSArrayは参照である。

変更できないArray型,Dictionary型

今までArray型やDictionary型をvar、
つまり変数として使ってきた。

変更できない固定のArray型やDictionary型を使うこともできる。

import UIKit

var dictionaryA = [1:1, 2:4, 3:9, 4:16]
var dictionaryB = dictionaryA
println(dictionaryA)
println(dictionaryB)

// dictionaryBから要素を削除
dictionaryB[4] = nil
println(dictionaryA)
println(dictionaryB)

// ⇒ dictionaryAの要素は削除されていない

// arrayBにArrayAを入れる
var arrayA = [1,2,3,4,5]
var arrayB = arrayA

println(arrayA)
println(arrayB)

// ⇒ arrayAとArrayBが出力した内容は同じだ

// arrayBの0番目の要素を削除
arrayB.removeAtIndex(0)

println(arrayA)
println(arrayB)

// ⇒ arrayAとarrayBで異なる内容が出力された
//   Array型もDictionary型と同様にコピーするのだ

/*  今の話の部分  */
let arrayC = [1,2,3,4,5]
let dictionaryC = [1:1, 2:4, 3:9, 4:16]

// このarray型とdictionary型は要素を変更できない
arrayC.append(6)
arrayC.removeAtIndex(0)

dictionaryC[5] = 25
dictionaryC[1] = nil

スクリーンショット 2014-09-25 20.37.09.png

今回はここまで。

 
・Swiftに関する他の記事はこちら
Swift入門 勉強記録 その1 Swiftとは、Playground起動

Swift入門 勉強記録 その2 変数、定数、文字列

Swift入門 勉強記録 その3 セミコロン

Swift入門 勉強記録 その4 数値、真偽値

Swift入門 勉強記録 その5 Tuple(組)とは

Swift入門 勉強記録 その6 数値を文字列とするには

Swift入門 勉強記録 その7 繰り返し

Swift入門 勉強記録 その8 条件分岐

Swift入門 勉強記録 その9 Optional型

Swift入門 勉強記録 その10 Collection

10
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
9