どうもこんばんは。
肉球 (@nikuq299com) です。
前回の投稿ではplaygroundを使ってプログラムを動かしてみましたので、これから実際に iPhone で動くアプリを作ってみたいと思います。
ただ、その前に少しだけプログラムに関する説明をします。
今回の記事は3となります。
- iOSアプリ開発の前準備
- Xcodeを使って簡単なプログラムを動かしてみる
- iOSアプリの基礎 (← 今回ココ)
- 部品の使い方
- 地図を表示してみる
- SNS機能を呼び出してみる
- カメラを使って写真を保存してみる
目次
はじめに
アプリ開発で知っておくと良いことをお伝えします!
今回は、 iOSアプリ (というか、GUIアプリ) が動く仕組みの概要をお伝えします。
この記事を読んで、以下2点を理解していただけると幸いです。
- アプリ開発は入門のハードルが低く、誰でも挑戦できる!
- アプリ開発を極めるには高度な知識が必要となる!
1と2で言っていることが逆じゃないか!と思われるかもしれません。
たとえ話ですが、クルマは免許を取れば誰でも公道で運転できますが、サーキットで速く走るためには、相応の訓練と運転知識が必要になります。
アプリ開発も同様に、誰でもアプリを作れるようになれますが、質の高いアプリを開発するには訓練と知識が必要ということです。
アプリ開発は、コンピュータを相手にしているだけあって、続ければ論理的思考やモノゴトを抽象化する能力を鍛えることができますので、まずは興味を持っていただき、アプリ開発にチャレンジしてもらえたらと思います。
iOSアプリ を作る上で知っておくと良いこと
アプリ開発は抽象化したパーツを使ったパズルです!
前回の投稿にて、プログラムを書く時、最初はマネをすれば良いと言いましたが、何も知らずにマネをするより、自分がこれからやろうとしていることの概要を知っていると、より効率が上がります。
【例】言葉は要素を抽象化してパーツ化したものである
例えば、中学校で英語の授業を受けた時に、文法でSVC (主語、動詞、補語) とか、SVO (主語、動詞、目的語) とか言うことを教わったと思うのですが、私は言語の本質って、これだけだと思っています。
各単語を主語、動詞、補語、目的語という風に抽象化して組み合わせるだけ。
無理やりですが、日本語を英語と対比する場合、日本語はSOV (主語、目的語、動詞) という感じでしょうか。
プログラム言語も同様に要素を抽象化してパーツ化したものである
※この章は余談で、この内容を理解しなくてもプログラムは書けるので、分からなければ読み飛ばしてもらっても構いません。
プログラミングも、言葉と同じです。
プログラミングでコンピュータと会話できる文法は下記3要素しかなく、アプリはこの3要素だけで動いています。
- 処理を行うパラメータ (以降、変数) を定義する
- 条件分岐する (評価項目に対してYESかNOを判定する)
- 同じことを繰返す処理を行う
デジタルは、1か0の組み合わせと言うことを聞いた事がある人も多いと思いますが、パソコンやスマホもデジタル機器なので、内部的には1と0だけの数字 (2進数) を組み合わせて動いているため、処理はYES (1) かNO (0) しかないのです。
みなさんが普段使っているアプリの複雑な画面や、ブログで読んでいる文字も0と1で構成しています。
プログラム処理をパーツの集合として捉える場合、最も単純と思われる電卓のプログラムで考えるてみましょう。
例えば、8 + 7 を計算して15という答えを出すプログラムは、下記のようになります。
- 第1項の8を変数Aとする → 8を2進数で表現すると、”1000”
- 第2項の7を変数Bとする → 7を2進数で表現すると、”111”
- AとBの論理和を算出する → ”1000” と ”111” の和 (論理和) を取る
- AとBの論理和は、”1111” → ”1111”を10進数で表現すると15になる
図3. 2進数で8 + 7 を2進数で計算する
こんな感じで、コンピュータは演算もゼロと1だけで行います。
アプリ開発で登場するパーツ
簡単な図を書いてみました。
図4. アプリはAppleが用意した部品を貼り付けるだけで作れる
我々は、普段スマホを利用する時に、直感的に使える部品で色々な処理をスマホへ命令します。
あれを作るのは難しそうと思う方もいると思いますが、iOSのアプリ開発は、Appleが用意した部品を組み合わせてアプリを開発するため、開発者は文字の大きさや導線などのデザインと、部品の振る舞いだけに注力すれば良いのです。
プログラミングで難しいところ
上記だけで話を終わらせると、本職プログラマーの方からお叱りを受けそうなので、プログラミングの何が難しいのかも、合わせて説明します。
アプリ開発の難しいところを一言でいうと、モノゴトを抽象化する能力です。
わかりやすい例を、下記に2点挙げます。
数式を使った処理の効率化
先日投稿した記事にて、playgroundを使ったグラフを描画するサンプルプログラムを書きました。
コレは、for-in文という書式で、「0 + 1、 1 + 2、3 + 3、… 、45 + 10」 というように足し算を10回行い、1回ごとの計算結果をグラフ領域にプロットしています。
処理を簡単に説明すると、以下のとおりです。
- 足し算の1要素となる変数 value を定義する。初期値はゼロ。
- この処理は、value と num の加算を10回繰り返す。
- “for num in 1…10” は、足し算の1要素となる変数numを10回インクリメント (1回目のnum は1、2回目のnum は2、… 10回目のnumは10) するという意味。
- “value += num” は、変数value にインクリメントしたnumを加算するという意味 (value += numは、1回目で0 + 1、2回目で1 + 2、… 10回目で45 + 10という計算を行う) 。
単純な数式で書くと下記の通りとなります。
変数valueに対して、変数 num を10回加算する処理をしており、カッコの計算をするたびに、カッコ内の計算結果をグラフ領域へプロットします。
(0 + 1) + (1 + 2) + (3 + 3) + (6 + 4) + (10 + 5) + (15 + 6) + (21 + 7) + (28 + 8) + (36 + 9) + (45 + 10)
文字で書いてもわかりにくいので、各変数がどのように変化していくか表にしました。
表1. for-in文実行時の変数値
繰返し回数 | numの値 | valueの値 | 計算式は( 前回の value + num) + num |
---|---|---|---|
0 | 0 | 0 | 計算前 |
1 | 1 | 1 | 0 + 1 = 1 |
2 | 2 | 3 | 1 + 2 = 3 |
3 | 3 | 6 | 3 + 3 = 6 |
4 | 4 | 10 | 6 + 4 = 10 |
5 | 5 | 15 | 10 + 5 = 15 |
6 | 6 | 21 | 15 + 6 = 21 |
7 | 7 | 28 | 21 + 7 = 28 |
8 | 8 | 36 | 28 + 8 = 36 |
9 | 9 | 45 | 36 + 9 = 45 |
10 | 10 | 55 | 45 + 10 = 55 |
この10回繰り返す計算は、n (n + 1) / 2 という公式で置き換えられます。
今回のサンプルプログラムの場合だと、繰り返す計算回数はわずか10回ですが、これが100万回、1億回と繰り返す場合は、後者の公式を使った方が、はるかに処理が速くなります。
100万回繰り返す場合、前者は計算を100万回実行しなければなりませんが、後者は計算を3回実行するだけで済むためです。
公式を使った計算は以下の3回のみとなります。
- n + 1 (この結果をaとする)
- n * a (この結果をbとする)
- 最終的な解 = b / 2
上記に挙げた2つの計算において、後者の処理速度は前者の処理速度より33万倍早くなります (あくまで例なので、他の処理速度に影響する要因は除外します)。
優秀なプログラマーは、このように処理を抽象化して質の高い処理を創造します。
設計における問題のモデル化
コレも、我々が普段無意識に行っている事なのですが、意識していないと汎用性の高いアプリの設計を行えません。
例えば、自動車を運転する場合、免許さえ持っていれば、トヨタ車でも、ホンダ車でも、BMWでも、乗ることができると思います。
なぜかというと、日本を走ることができる自動車の運転席は、国土交通省の定める保安基準に必ず則っているからです。
日本で走る事ができるクルマは、どのメーカが作るクルマでも、必ず保安基準に則っているため、前の座席に運転席があり、座席の周りには、エンジンスターター、ハンドル、アクセル、ブレーキ、シフトレバーがついています。
運転免許証を持っている人は、意識していなくてもそれを理解しているから、初めて乗るクルマでも迷うことなく運転することができます。
運転席をプログラミングする時にする設計も同様です。
高級な素材を使っていようが、エンジンが小さかろうが、クルマはクルマなんです。
図1. プログラム上にクルマを定義する場合のダメな例
図2. プログラム上にクルマを定義する場合の良い例
まとめ
モノゴトに取り掛かる前には、その本質を抑えると理解が早い!
プログラミングで大事なことは、モノゴトを抽象化する能力と言うことをわかっていただけたでしょうか?
もし、私の説明が・・・で分かりづらい場合は、コメントをいただければ、個別に回答をさせていただきます。
もし、本格的にプログラミングをより本格的に学びたい場合は、TEACH ACADEMYの iPhoneアプリコース などのオンライン学習プログラムを使うことも、費用対効果的に検討対象に入れることをおすすめします。
ココからは余談となります。
図解する場合って、使える素材に制限があると、分かりやすいものができないですね。
最近、グラフィックレコーディングを勉強するつもりなので、ブログに載せる図解も、手書きで分かりやすいモノを作れたら良いなと考えています。
それでは。ごきげんよう。
コメントを残す