読者です 読者をやめる 読者になる 読者になる

ハイパーニートプログラマーへの道

頑張ったり頑張らなかったり

【Swift】いろいろやってみる(文字列、配列など)

やりながらとったメモより。
ちなみに実行はコマンドラインから。設定等は前回の記事に。

Swiftをコマンドラインから実行してみる - ハイパーニートプログラマーへの道

文字列の連結

 21> let label = "The width is "
label: String = "The width is "
 22> let width = 94
width: Int = 94
 23> let widthLabel = label + String(width)
widthLabel: String = "The width is94"
 24> let widthLabel = label + " " + String(width)
widthLabel: String = "The width is 94" 

"The width is "最後にスペース入れてるんだけど、それが無視されちゃう?(23行目の結果) 間に" "かませた。
キャストは変数のほうを()で囲むんだなと。

116> let a = 10
a: Int = 10
117> let b = 10
b: Int = 10
118> var answer = a + b
answer: Int = 20

この場合、answerにはvar(変数)使えよと。let使って全然だめだった。基本的なところがなってない(私が)

配列

 49> var shoppingList = ["catfish", "water", "tulips", "blue paint"]
shoppingList: String[] = size=4 {
  [0] = "catfish"
  [1] = "water"
  [2] = "tulips"
  [3] = "blue paint"
}
 50> println(shoppingList[1])
water
 51> shoppingList[1] = "bottle of water"
 52> println(shoppingList[1])
bottle of water

shoppingListの1番目("water")を"bottle of water"に変える。

 53> println(shoppingList[0..3])
[catfish, bottle of water, tulips]
 54> println(shoppingList[0...3])
[catfish, bottle of water, tulips, blue paint]

[0..3]で0番目から2番目まで表示。[0...3]で3番目まで表示。でも[]がついてるけど、どうなんでしょ。

Dictionary

 62> var occupations = [
 63.     "Malcolm": "Captain",
 64.     "Kaylee": "Mechanic",
 65. ]   
occupations: Dictionary<String, String> = {
  [0] = {
    key = "Kaylee"
    value = "Mechanic"
  }
  [1] = {
    key = "Malcolm"
    value = "Captain"
  }
}
 66> println(occupations["Kaylee"])
Mechanic
 67> println(occupations["Malcolm"])
Captain

キーと値を登録。キーで呼び出し。
これ、最初に"Malcom"、次に"Kaylee"を登録してるのに逆になるのはなんで?

 78> var occupations = [
 79.     "Malcolm": "Captain",
 80.     "Kaylee": "Mechanic",
 81.     "noriyo_tcp": "NEET",
 82. ]
occupations: Dictionary<String, String> = {
  [0] = {
    key = "Kaylee"
    value = "Mechanic"
  }
  [1] = {
    key = "Malcolm"
    value = "Captain"
  }
  [2] = {
    key = "noriyo_tcp"
    value = "NEET"
  }
}

私を最後に登録したら2番目になったね。その上の"Kaylee"と"Malcolm"が逆になってるのはなんでなんですかと。

The Swift Programming Language: Collection Types

のサンプルコードを参考に

 91> var airports: Dictionary<String, String> = [
 92.     "TYO": "Tokyo",
 93.     "DUB": "Dublin"
 94. ]   
airports: Dictionary<String, String> = {
  [0] = {
    key = "DUB"
    value = "Dublin"
  }
  [1] = {
    key = "TYO"
    value = "Tokyo"
  }
}

一応Dictionary<String, String>も記述して、と。 だからなんで逆になるのさ?TよりDのほうがアルファベット順では先だから?

と思ったら、こちらの記事より

Tumbling Dice — [Swift]Appleの新言語「Swift」のリファレンスを読む(3)

ちなみに「Dictionaryは順序付けされていないコレクション(unordered collection)だから要素の順番は保証しないよ」とのことです。

上記のAppleのドキュメントではここの部分ですかな。

Unlike items in an array, items in a dictionary do not have a specified order.

お次は

 95> var scores = [
 96.     "A": 100,
 97.     "B": 50,
 98. ]   
scores: Dictionary<String, Int> = {
  [0] = {
    key = "A"
    value = 100
  }
  [1] = {
    key = "B"
    value = 50
  }
}
 99> println(scores["A"])
100
100> println(scores["B"])
50 

Keyには文字列、Valueに整数セットしてみましたが、ちゃんと<String, Int>にしてくれてますな。便利。

101> println("The dictionary of scores contains \(scores.count) items.")
The dictionary of scores contains 2 items.
102> scores["C"] = 0
103> println("The dictionary of scores contains \(scores.count) items.")
The dictionary of scores contains 3 items. 

countプロパティで要素数の取得。scores["C"] = 0で新たに要素を追加。3itemsになった。

104> println(scores)
[C: 0, A: 100, B: 50]
105> scores["D"] = nil
106> println(scores)
[C: 0, A: 100, B: 50]
107> println(scores["D"])
nil
108> if let oldScore = scores.updateValue(30, forKey: "D") {
109.     println("The old value for D is \(oldScore).")
110. }   
111> println(scores)
[C: 0, D: 30, A: 100, B: 50]

key:"D"にnilを入れてみる。println(scores)では表示されないが(当たり前か)println(scores["D"])ではnilと表示される。 updateValue()で30をセットして、古い値を返してくれるのだが(108〜110行目)、nilなんで表示はされない? 111行目でprintln(scores)すると、Dに30がセットされているのが分かる。

112> if let oldScore = scores.updateValue(10, forKey: "C") {
113.     println("The old value for C is \(oldScore).")
114. }
The old value for C is 0.
115> println(scores)
[C: 10, D: 30, A: 100, B: 50]

Cが0なのはかわいそうなので、10にしてやる。oldScoreに0を返している。 println(scores)で確認。Cが10になってる。よかった♡

こんな感じでグダグダやってA Swift Tourの章さえ終っていないではないか・・・。