見出し画像

iPhone アプリを自分でつくる 2.

今回の内容: 変数を書いてみる

前回Xcodeの準備ができたのでPlaygroundでSwiftのコードを書いていきます。

1行目にはimport UIKit / Cocoaと記入してある

 コードを記入する前に
 前回お話しした通りplaygroundの1行目にはmacOSを選んだ方はimport Cocoa、iOSを選んだ方はimport UIKitと記入があります。
UIKit(ユーアイキット) やCocoa(ココア) というのはこれから書くSwiftという言語を理解してくれるアプリのことで、フレームワークと呼ばれるものです。importとはそのフレームワークを取り込むということです。少し付け加えるとiOSでもmacOSでもFoundation(ファウンデーション)というフレームワークを働かせてSwiftを理解できるので、import Foundation に修正しても動きます。
コードの一番上にSwiftを理解してくれるフレームワークが取り込まれていないと、これから書くSwiftもただの文字列になってしまいます。
その下には var greeting = "Hello, playground" とありますが、例文として記入してあるものです。まずこれをみて行きましょう。

今回実施する内容
 変数を使ってみる
 間違えたコードを記入したときのエラー表示を確認してみる

変数とは
 変数は数字や文字を保存する箱に例えられます。
アプリの作成ではこの箱に入っている数字や文字を操作しては、それに連動する画面を更新させていきます。

例文をみていきましょう。
  var greeting = "Hello, playground" のvar(バー) は新しい変数をつくるという意味です。(var はvariable バリアブル:変数に由来します)
"Hello, playground"は、Hello, playgroundという文字を表します。
(半角ダブルクオテーションで挟まれた文字は、変数などではなく通常の文字であるということ)
そして= イコール記号は右にあるもの("Hello, playground")を左の変数箱に入れるという意味です。なのでこの例文の意味はgreeting という新しい変数箱に Hello, playground という文字を入れます、ということです。
数学で言う左辺と右辺は等しいという記号とは別ものです。これもつまづきのひとつ(私のことです)になるので注意してください。

今度は実際に記入してみましょう。
先ほどの例文は消去して var place  = "Tokyo" と記入します。 
※ var は必ず小文字、半角です。コードは半角で記入しまし。イコールの左右にはそれぞれ半角のスペースを入れますが、スペースも含めて半角です。全角が使えるのは””に囲われたところだけ(つまり文字として扱うところだけ)です。

※この半角の記述については「違うよ」と言われそうですが。最初のうちは全角の使える文字部分もローマ字でも良いので半角ですすめた方が良いと思います。
コードを打つことに集中できますので。

import Cocoa

var place = "Tokyo"

var placeで place という名前の変数をつくりました。
= イコール記号は右にあるものを左の変数箱に入れるという意味でしたね。
今回の場合、右のTokyoを左のplaceという箱に入れることになります。
"Tokyo" の文字は""で囲われていますが、これは文字ですよ、ということですね。
これでplaceという変数箱にTokyoという文字が入りました。
では、placeという箱に本当にTokyoという文字がきちんと入っているか確認してみましょう。

print(place) と入力してプレイボタンをクリックしてみる

例のように先ほど記入した行の下にprint(place)と記入してから左下のプレイボタン(三角グレー印)をクリックするとコードを実行することができます。playgroundで初めてプレイボタンをクリックしたときは、2, 3分程度(私のMacでは5分ぐらい?)待ったあとでやっと表示されるので心配になるかもしれませんが、2回目以降はもう少し早くレスポンスが帰ってきます。
(ときどきエラー表示のシート画面がでてきてびっくりしますが気にせずOKとして再度チャレンジしてください。)

すると最下部の区分けされたスペース(コンソール)にTokyoとでてきました。

下にあるコンソールにTokyoと表示された

print(文字)は文字を表示(画面に出力)する関数と呼ばれるものなので、place という箱にはTokyoという文字が入ったことが確認できました。このprint() での確認は通常のアプリ作成でも日常行われるものです。
※関数については後の方の回で説明します。
もしコンソール枠が表示されていないときは右下の小さな四角のアイコンをクリックするか下方のラインを上にドラッグするとでてきます。
また行の右側に"Tokyo"の文字が表示されていますが、Xcodeが読み取った文字や
数字のデータが右側に表示されていきます。(Playgroundのやさしさです)

print(place) の右側には"Tokyo\n"の文字がありますが、\n(バックスラッシュエヌ)の文字は改行コードです。print(文字 or 変数)を実行すると内容を表示させたあとに改行コードを加えていることが読み取れます。

次は試しに var place = Tokyo と、さきほどの""を削除してから実行するとどうなるかみてみましょう。

"Tokyo"をTokyoにしてみた

すると赤のハイライトでエラー内容が表示されました。内容としては、
Tokyo は現在のスコープ(捜索する範囲内)にはありません、という意味です。
つまり""で囲まれていない文字は変数と考えるため Xcodeは var Tokyoなどが
どこかにないか探したけれど見つからなかったということです。
また下のコンソールにはplayground: 3: 13: error   と表示されました。これは3行目の13文字目(Tokyoの T )のところでエラーになりましたよ、という意味です。

もう一つの注意点はコードは半角で記入するということです。
先ほどTokyoの文字を半角 " で挟みました。
試しに全角のダブルクオテーション ” で挟んでみます。

ダブルクオテーションを全角にするとエラーが表示された

今度は、 3 Consecutive statements on a line must be separated by ';'
とエラーが表示されました。
この3というのは3つエラーがでましたよ、ということです。
3をクリックしてみます。右上の赤丸3もクリックしてみます。

3と表示されているところを両方クリックしてみた

右上の赤丸3もハイライト文字の横の3も順番は違うものの3つのエラー内容が表示されました。
またFixのボタンが表示されましたが、これをクリックすると修正提案として
コードを書き換えてくれるものです。

最初の Consecutive statements on a line must be separated by ';' の横のFixをクリックして修正提案を受け入れます。

セミコロンが追加されたが新たにエラーが2つ発生した

するとなぜかTokyoの文字の前にセミコロンがついて新しいエラーが表示されました。最初のエラー内容は「連続した記述をするときはセミコロンで分けてね」、ということでしたが、そもそも記述した内容は1つのまとまりなので的外れな提案でしたね。全角でコードを記入するとXcodeが理解できなくなって変な提案をするときがあるのです。
あと2つのFix提案をクリックしてみます。こちらの提案は”(全角ダブルクオテーション)を"(半角クオテーション)に変更してみては? ということで、実際に正しく修正されてエラー表示もなくなります。

※ セミコロン; は例えば、print("Tokyo"); print("Osaka")  のようにコードを1行にまとまめて横並びに書くときに使うものですが、Swiftでは基本的に横並びでの記入はしませんのでセミコロン; を使うことは99.99%ぐらいない、と考えてください。
逆に1行の長いコードを改行してわかりやすくすることは頻繁にあります
なお、print("Tokyo", "Osaka", "Nagoya") というような書き方は普通にしますが、今回とは関係ありませんので、ご参考まで。

試してわかったこと
 1. コードは半角で記入する。特に小さな記号やスペースは全角・半角がわかり
  にくい
  (※ 全角が記入できるのは、"ダブルクオテーションで囲まれた文字だけで
   す。今回の例で言えば"Tokyo"の部分は"東京"と書けるように) 
 2. Xcodeはプレイボタンが押されなくてもSwiftを常時読み取って文法にエラー
  があればハイライトで教えてくれる。
  プレイボタンが押されることによってprintなどの関数が実行される。


今度は変数 place に "Osaka" と入れてみます

  3 var place = "Tokyo"
  4 print(place)
  5 
  6 place = "Osaka"
  7 print(place)

6行目に記入した place にはvar はついていません
place という箱(変数)はすでにつくられているのでvarはつけることはできません同じスコープ内(影響の及ぶ範囲内)に同じ変数名をセットすることはできません。スコープについては今後も説明していきます。
 place = "Osaka"と書きます。
例を実行してみると、Tokyo   Osakaの順に2行になってコンソールに表示されます。

  3 var place = "Tokyo"
  4 print(place)
  5 
  6 place = "Osaka"
  7 print(place)

// コンソール表示---------------------------
Tokyo
Osaka

実行内容の確認
①最初にvar placeで新しいplace変数箱がつくられる。
 ダブルクオーテーション"に挟まれたTokyoを文字として認識
 イコール=の右の文字を変数箱 place に入れる。
②print(place)でこの時点ではplaceはTokyoが入っていることを確認できる。
③place = "Osaka" でplace変数箱の中身に"Osaka"を入れる。
④print(place)でplaceにはOsakaが入ったことが確認できる。
 

ポイント
 1. playgroundではコードは上から順に実行される。
  ひとつのコードの実行時間は数億分の1秒のようなごく単時間なので、
  同時に実行されているように見えますが、実際には上から順に実行されます)
  なお実際のアプリ開発では、複数のコードのまとまりをつくり(よく言われる
  オブジェクトです)、まとまりごとに実行されるので、その順番をコントロー
  ルしていきます。
 2. print()関数を使用するとその時の変数の様子がわかる。実際のアプリ開発に
  おいても print()関数を使って変数が想定通り動いているか確認を行います。

下記の例のように同じ変数を使おうとするとエラーとなります。

var color = "Blue"
var color = "Red"    x invalid redeclaration of 'color'

「変数colorを再宣言したことで無効」とのエラーが表示された。
 同じ名前の変数を使えないのは大変なのでは?と思うかもしれません。
   Playground 上では、コードを書いているファイル自体がスコープとなりますが
 実際のアプリ開発ではコードのまとまりごとでスコープをコントロールしてい
 くので、同じ名前が使えないから困ることはあまりないと思います。
 ただ、似たような名前ばかりになってしまったり何を意味しているのか想像が
 つきにくい名前になったりすると、後から見返したり引き継いだりするときに
 困るので、名前のつけかたが良いプログラムを開発するカギになるとも言われ
 ています。
 ただ個人開発をする上では、最初はあまり気にせずどんどん作っていくことが大
 事かと思います。

まとめ
・playgroundの書きはじめにはフレームワーク(UIKit, Cocoa, Foundationどれ
 か)をimportしておく。
・コードは記号やスペースを含めて半角で記入する。
・変数は数字や文字を保存する箱のようなもの。var で新しい変数をつくる。
・いったん作られた変数を使用する際はvar をつけない。
・文字を取り扱う際には半角ダブルクオテーションで囲む。全角文字が使用できる
 のは半角ダブルクオテーションで囲んだ内容部分だけ。
・Xcodeは常時Swiftコードの文法をチェックしていて、読み取れない場合はエ
 ラーを表示し修正提案をする。ただし修正提案が正しいとは限らない。
・playgroundでは実行ボタンをクリックするとコードが上から順に実行される。
・print(変数)で変数に入った内容を確認できる。変数を変更した後にprint(変数)を
 セットして変数の変化をみることができる。

次回の内容

 第3回は「定数について、名前の付け方、オプショナルについて」、です。
 よろしかったらまたご一緒にお願いします。 

この記事が気に入ったらサポートをしてみませんか?