【#10 音をならすアプリ】コードの中身を理解しよう!
こんにちは。Step App Schoolの小林です。
前回・前々回と、音をならすアプリを作りました。コードの中身の解説をしていきましょう。まだアプリを作っていない場合は、下記サイトを参考に作ってみてください。おおよそ90〜120分くらいで、動物のなき声を再生するアプリが作れます。
1.注意点:すべてを理解しようとしない
最初に注意点です。プログラミングで挫折する人の大半は、何事も完璧に進めようとして「わからない」「おぼえられない」となることです。たとえて言えば、飛行機に乗る前に「鉄の塊が空を飛ぶしくみがわからない」と言うようなものです。
乗ることと、しくみを理解することが違うように、アプリのしくみを全部理解しなくてもつくれます。「ああ、このボタンを押して音をならしたいときはこうやってコードを書くんだな」とわかればいいのです。細かい理屈は、進めていくうちに覚えます。
プログラミングは「言語」と呼ばれているだけあって、しくみがわからなくても書けるしくみなっています。日本語の主語と述語がわからなくても、子どもは言葉を覚えていきますよね? ものまねをしているうちに、まちがえて、訂正していくうちに、徐々に中身がわかってきます。あまりごちゃごちゃ考えずに、ひとまずトライしてみましょう。
2.プログラミング記述の基本ルール
プログラミング言語全般に通じる基本的な記述ルールをおおまかに説明します。それは「いろんな機能をいれものに入れて、名前をつける」ということです。飲みものをペットボトルに入れて「私のコーラ」などと名前をつけておくことと同じです。もう少し詳しくみてみましょう。
たとえばあなたが、くすりや砂糖、飲みものをリュックサックにまとめたいとします。そのとき、そのまま入れますか?
くすりや砂糖をそのままリュックに入れて運ぶ人はいませんよね? まちがってフタがひらいて大惨事になったことは何度かありますが、ねらってそういうことをする人はいないと思います。じゃあ、どうしますか?
当然、小分けの袋にまとめ、丁寧な人は「お腹が痛くなったら飲むくすり」などと書いておくでしょう。
さらに、似たものがいくつかあれば、それらをまとめておくこともあるでしょう。
この「1つのいれものにまとめること」と「名前をつけること」が、プログラミングの構造です。最終的に、すべてのものがいれものに入った状態で、1つにまとまり、それらを効率的に呼び出せるようになっていれば、アプリが完成します。
3.具体的にコードをみてみよう
では、具体的にコードをみてみましょう。全文はいかのとおりです。
import UIKit
import AVFoundation
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}
//音声ファイルを管理する機能。""で囲んだ部分にファイル名を入れる
let dogPath = Bundle.main.bundleURL.appendingPathComponent("dogSound.mp3")
//音を鳴らす機能
var dogPlayer = AVAudioPlayer()
@IBAction func dogSound(_ sender: Any) {
do{
//音声ファイルを、音を鳴らす機能に取り入れる
dogPlayer = try AVAudioPlayer(contentsOf: dogPath, fileTypeHint: nil)
//実際に音を鳴らす
dogPlayer.play()
} catch {
//エラーが発生した(音声ファイルを読み込めなかった)時に表示する
print("エラーが発生しました")
}
}
let catPath = Bundle.main.bundleURL.appendingPathComponent("catSound.mp3")
var catPlayer = AVAudioPlayer()
@IBAction func catSound(_ sender: Any) {
do{
catPlayer = try AVAudioPlayer(contentsOf: catPath, fileTypeHint: nil)
catPlayer.play()
} catch {
print("エラーが発生しました")
}
}
}
最初の「import AVFoundation」は、「音をならすフレームワークを呼び出してインストールする」という意味です。フレームワークとは、いろんな機能がつまったテンプレートのようなものだと思ってください。
途中、最初から書いてあるコードの説明は飛ばします。次に「let dogPath = Bundle.main.bundleURL.appendingPathComponent("dogSound.mp3")」と書いてある部分があります。「Bundle〜」は音声ファイルを管理する構文です。構文なので「ああ、そう書くのね」と覚えるしかないです。文章の「""」にはさまれている部分に、再生したい音声ファイルを入れます。その、音声ファイルを管理する機能に「dogPath」と名前をつけました。イメージはいかのとおりです。
次の「var dogPlayer = AVAudioPlayer()」は、音をならす機能「AVAudioPlayer」を呼び出して「dogPlayer」と名前をつけています。もっと難しい表現を使うと、「AVAudioPlayer」のクラスを実体化(インスタンス化)していると言います。下の図をみてください。
クラスとは、設計図のようなものです。ただし、設計図には縮尺は書いてありますが、実際の大きさは書いてないものを想像してください。これを20m×20mの大きさでつくるのか、それとも100m×100mの大きさで作るのかは本人に委ねられているイメージです。「AVAudioPlayer」はクラスとして設計図があるので、実際に使うときは実体化して名前をつけます。それが「var dogPlayer = AVAudioPlayer()」です。
クラスの解釈はすごくむずかしいので、今は「そういう書き方をするんだね」くらいで理解しても大丈夫です。
「@IBAction func dogSound(_ sender: Any) {}」は、「dogSoundというボタン(イヌのイラスト)を押したとき、{ }の中のことを実行してください」というコマンドです。中身をみていきましょう。
なかに「do-catch文」と「try文」の組み合わせが入っています。
do {
try メソッド
} catch {
エラー処理の内容
}
これは、まず上記のコードのうち「メソッド」と書かれた部分を実行してみて、もしファイルを読み込めないなどのエラーが発生したときは「エラー処理の内容」と書かれた部分が実行されるという構文です。音声ファイルを万が一読み込めなかったときにエラーを出すためのもので、音を鳴らしたいときは書くのがルールになっています。今回の場合は「メソッドがうまくいかなかったら「エラーが発生しました」と表示するように書いています。
次にメソッドの中身についてみていきましょう。
つい先ほど、音声ファイルを管理する機能「dogPath」と、音をならすための機能「AVAudioPlayer」を呼び出しましたので、「AVAudioPlayer」のなかに「dogPath」をいれ、さらに「dogPlayer」と名前をつけたものに入れます。「dogPlayer.play()」は、音を再生するための方法です。
dogPlayer.play()
「dogPlayer」と名前をつけたものを再生するときに「.play()」をつけます。これはルールなのでそう覚えましょう。ネコの音声再生もイヌと同じなので省略します。
4.ルールを覚えよう
「コードの解説といっても、ルールばっかりだな。そういうルールってどこかにまとまってないの?」と思う方もいるでしょうね。その通りです。Swiftを管理するAppleの開発者専用ページにまとまっています。
上のサイトは、音をならす機能をまとめたもの(クラス)「AVAudioPlayer」の解説が書いてあります。英語が苦手だとクラクラしますね。エンジニアのみなさんはがんばって読んでいます。
5.まとめ
この解説を読んでも「fileTypeHintって何?」「nilってどういうこと?」などの疑問が出てくると思います。ここで解説してしまうと脳のオーバーフローを起こすので、またの機会に説明します。大事なことは「一度に全部理解しようとしないこと」です。「いまはわからなくていい!」と割り切って、次のアプリを作っていきましょう。
次の記事はこちら↓
↑は、私がいるプログラミングスクールです。ご興味がある方はぜひどうぞ。また、過去に作ったアプリは以下よりアクセスしてみてください。
【#1 プログラミングの準備】
【#2 背景変換アプリ】カンタンなコードを書いてみよう
【#3 背景変換アプリ】プログラムの中身を理解してみよう
【#4 Swift iPhoneアプリをつくる流れを理解しよう】
【#5 画像切替アプリ】お気に入りの写真を表示しよう
【#6 画像切替アプリ】コードの内容を理解してみよう
【#7 iPhoneアプリ開発でよく出るエラーをつぶそう!】
きょうもお疲れさまでした。
馬券が当たった方、宝くじを当てた方はお願いします。