こんにちは。だいぶ日が空いてしまいましたが、前半の続きです。
kabos.hatenablog.jp
注意 (メモ)
実行するプラットフォームを、macOS ではなく ios にしていると極端に動作が重くなるようです。
option + command + 1 でファイルインスペクターを開き、 Playground Settings > Platform で OS X を選択すると軽くなります。
レッスン13 QuestionBot
Playground で適当にデバックして、完成してからアプリケーションに配置すると便利。
演習問題解答
func responseTo(question: String) -> String {
let lowerquestion = question.lowercased()
if lowerquestion.hasPrefix("hello") {
return "Why, hello there!"
} else if lowerquestion.hasPrefix("where are the cookies?"){
return "In the cookie jar!"
} else if lowerquestion.hasPrefix("where") {
return "To the North!"
} else if lowerquestion.hasPrefix("can"){
let defaultNumber = question.characters.count % 2
if defaultNumber == 0 {
return "Yes"
} else {
return "No"
}
} else {
return "Nyanko"
}
}
レッスン14 配列とループ
Swiftでは、リストを「配列(Arrays)」と呼ぶ。
配列は次のように作る。
let animals = ["cat1", "cat2", "cat3"]
var list = [String]()
配列は0から始まる「インデックス」を持つ。
animals[0]
のようにすると、そのインデックスに保存された値を取り出すことができる。この場合、取り出せる値は "cat1" である。
配列に値を追加する方法は3通りある。先ほどの空の配列に値を追加することを考える。
list.append = "cat"
list.insert("neko", at: 0)
list += ["nyanko", "pretty cat"]
値の削除もできる。removeFirst()で最初の値、removeLast()で最後の値、removeAll()で全ての値を削除することができる。
var numbers = [0, 1, 2, 3, 4]
numbers.remove(at: 2)
forループ文の説明。
演習問題解答
let index = 3
if index <= devices.count {
devices[index]
}
var musicList = [String]()
musicList.append("ABC song")
musicList.append("Cat song")
musicList.append("nyannyan song")
var karaokePerson = ["love", "coffee", "bird"]
musicList += karaokePerson
for song in musicList {
print("Now let's sing \(song)")
}
var yesVote = 0
var noVote = 0
for Vote in shouldMascotChangeVotes {
if Vote == true {
yesVote += 1
} else {
noVote += 1
}
}
if yesVote >= noVote {
print("可決")
} else {
print("否決")
}
let sleepHours = [6, 7.5, 4, 8, 6.5, 10, 12]
func mySleepHours(hours: Double) -> String {
if hours <= 7.5 {
return "You have slept for \(hours) hours. Good."
} else {
return "You have slept for \(hours) hours. Too much."
}
}
for hours in sleepHours {
mySleepHours(hours: hours)
}
for message in aliceMessages {
if message.contains("Caterpillar") == true {
print(message)
}
}
レッスン15 構造体
自分で構造体を定義することで、オリジナルの型を作ることができる。例えば、「type, age」というプロパティを持つ「Cat」という型を作成したい時は、次のようにする (型の名前は、必ず大文字)。
struct Cat {
let type: String
let age: Int
}
レッスン16 QuestionBot2
会話アプリを作る。配列や構造体の練習。
手順通りにやったらできます。
レッスン17 アクションとアウトレット
手順通りにやったらできますが、少し詰まったところのメモ。
解答 (一部)
書き足す部分だけ書きます。
updateColor() は、そのままです。
@IBOutlet weak var redSwitch: UISwitch!
@IBOutlet weak var greenSwitch: UISwitch!
@IBOutlet weak var blueSwitch: UISwitch!
override func viewDidLoad() {
super.viewDidLoad()
updateColor()
}
@IBAction func switchChanged(_ sender: UISwitch) {
updateColor()
}
リセットボタンの中身です。
@IBAction func reset(_ sender: UIButton) {
redSlider.value = 1
greenSlider.value = 1
blueSlider.value = 1
redSwitch.isOn = false
greenSwitch.isOn = false
blueSwitch.isOn = false
updateColor()
}
AUTO LAYOUT について。様々な機種に対応したUIを作ろう。
レッスン19 列挙型 (enumeration) とswitch文
次のようにして、「列挙型」を作れる。
enum ShopChoice {
case coffee
case food
case clothes
}
インスタンスは、
let choice = ShopChoice.coffee
とするか、
var choice: ShopChoice
choice = .coffee
とすると作成できる。下は型アノテーションを用いている。
enum を使うときは if文よりも switch文の方が適している。
演習問題解答
enum Direction {
case North,East,South,West
}
答えは2となります。
念のため Sources > Chickens.swift を見て確認しました。
switch文を習いましたが、2重で数えないためにはif文の方が良いと思いif文に。
for chicken in chickens {
if chicken.breed == Breed.leghorn {
if chicken.temper == Temper.hilarious {
chickenOfInterestCount += 1
}
}
}
struct Enemy {
let strength: Int
let speed: Int
let weapon: weapon
}
enum weapon {
case sword
case rubberMallet
case bomb
}
var BeachCount = 0
var ChocoCount = 0
for Vote in tripDestinationVotes {
switch Vote {
case .beach:
BeachCount += 1
case .chocolateFactory:
ChocoCount += 1
}
}
if BeachCount >= ChocoCount {
print("Beach")
} else {
print("ChocolateFactory")
}
func score(target: Target) -> Int {
switch target {
case .red:
return 10
case .green:
return 15
case .blue:
return 25
case .gold:
return 50
}
}
レッスン20,21 は、読んでみようやってみよう的なコーナーです。
長かったけどかなり勉強になりました!
まとめ (感想)
今まであやふやでやってきたことを初めて理解できた気がします。
また、エラーの見本なども提示されているのがわかりやすくてよかったです。
それから、こういう風に章ごとにまとめたりするのは意外と良い方法かもしれないと思いました。これからもやってみようかな。