Caution
お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。
Swift
入門編
- トップページ
- Swift入門編 - 変数と定数について
変数と定数について
みなさまどうも。いかがお過ごしでしょうか。
さて、前回はデータ型についてがっつり解説させて頂きました。お読み頂いた方は大変お疲れ様でございました。
では続きまして前回と同じように初心者の方の壁になりやすい『変数』の解説でございます。
しかもSwiftの『変数』周りはかなり制約が厳しく、データ型なども意識する必要があるので他の言語よりもちょいと難しめです。そこは気合で頑張っていきましょう。そのついでに『定数』ってやつもやっていきます。
まず最初に『変数』とはなんなのかというところなんですが、『変数』とは「データを一時的に保存できる加工や複製が可能な名前がついた領域」って感じです。参考書などでは「箱」と例えられる事が多いですね。
箱で例えると「データを一時的に保存できる加工や複製が可能な名前がついた箱」って感じです。名前をつけられて加工したり複製することができる、というのがポイントです。
言葉で説明してもなんのこっちゃって話になりますのでちょっと数学を思い出してみましょう。数学で方程式ってありましたよね。『x』とか『y』とか使ったあれです。
x + 1 = y
この概念と非常に近いです。数学では数値しか入れられなかったりするのですが、プログラム言語の『変数』には数値とか文字列とか真偽値とか様々なものを入れられます。
ではちょっとやってみましょう。Swiftで『変数』を作るにはこうします。
var test: String
これで『test』という『変数』が『String型』で作られました。
なんだかちょっと謎な感じですね。というわけで記法について見ていきます。
まず『var』ってやつがありますよね。これは『変数』を初めて作るときに必ず記述しないといけません。コンピューターに「変数作るよー!」って教えてあげてるようなイメージですね。
そんでもって『var』のとなりに半角スペースを置くのを忘れないようにして下さい。そうしないと『var』なのかなんなのかswift側で上手く判定できなくなってしまいエラーになっちゃいます。
vartest: String // これはエラーです。
そしたら『var』のとなりに『変数名』として使用したいお好きな名前を記述します。今回は『test』って言う名前を記述している感じですね。
そして『:』を記述してその後に型を指定してあげます。ちなみに『:』の左右の半角スペースはあってもなくてもOKです。この辺はお好みでどうぞ。
var s: String // 『:』の左右の半角スペースはあってもなくてもOKです。 var _s : String var n:String
さて、そしたら何も代入されてない『変数』だとあんまり意味ないので『変数』に値とかを代入してあげましょう。代入するにはこうします。
var s: String s = "Hello world" // 文字列『Hello world』を代入してあげます。
『=』が記述してあって、その右隣に文字列『Hello world』が記述されてますね。
さて、ここでちょっと注意点です。数学などの経験から『=』は「左辺と右辺が等しいことを表す記号である」と考えてしまうかもしれません。しかし、プログラムの世界の『=』は『代入』を行うための記号となります。
しかも左辺から右辺への代入ではなく、右辺から左辺への代入となりますので要注意です。プログラムでは特別なことがない限りは右辺から左辺へと処理が進んでいきますのでこちらも覚えておいてください。
プログラムの世界では『変数』などに何かを入れることを『代入』といいます。
さらにもういっちょ注意点なんですが、Swiftは型の規制が非常に厳しい言語です。先程のサンプルの変数『s』ですが、データ型に『String型』を指定していますね。なのでこの変数『s』は基本的に文字列しか入りません。他のものを入れようとすると怒られます。
var s: String s = 1 // 変数『s』はString型で宣言されているので数値は入れられません。エラーです。
Swift以外のフリーダムな言語だと何でも代入しちゃってOKだったりすることも多いのですが、SwiftはNGになります。ちょっと厄介ですが覚えておくようにして下さい。
さて、これで『変数』に文字列を『代入』することができましたので早速試してみましょう。変数『s』を『print()』で出力させるとすると以下のような記述になります。
var s: String s = "Hello world" // 文字列『Hello world』を代入してあげます。 print(s)
これを実行させるとこうなります。
Hello world
作成した『変数』の中身がちゃんと展開されて出力されていますね。さらに『変数』の中に数値を入れた場合はそのまま計算とかできちゃいます。以下のソースコードを確認してみてください。
var n: Int // 変数『n』と『_n』をInt型で生成します。 var _n: Int n = 1 _n = 2 print(n + _n) // 数値『3』が出力されます。
これを実行させると『3』が出力されます。なんだかプログラムっぽくなってきましたね。
あと注意点として『変数』を『"』で囲ってしまうと『変数』じゃなくて『文字列』の扱いになっちゃいますので注意です。
var s = "Hello world" print("s") // 変数『s』ではなく文字列『s』になっちゃうので『s』が出力されます。
さて、そして『変数』は上書きすることができます。以下のサンプルをみてみましょう。
var s: String s = "Hello world" s = "Hello Swift" // 変数『s』を上書きします。 print(s) // 『Hello Swift』が出力されます。
最初に変数『s』を『String型』で宣言してそのあとに文字列『Hello world』を代入してますね。そのあとさらに変数『s』に文字列『Hello Swift』を代入して上書きをしています。
注意点として、上書きするときも同じデータ型の値をいれてあげないとエラーになります。めっちゃ気をつけてください。
var s: String s = "Hello world" s = "Hello Swift" // 変数『s』を上書きします。変数『s』はString型の値しか入りません。 var n: Int n = 0 n = 1 // 変数『n』を上書きします。 n = "Hello world" // エラーです。変数『n』はInt型の値しか入りません。
こんな感じで『変数』は上書きすることができますので覚えておきましょう。
ちなみに特別なことがない限りはソースコードの上から順番に処理が進んでいくため、より下に記述されている方が優先されます。
var s: String s = "Hello world" s = "Hello Swift" // この代入処理が最後に行われます。 print(s) // 『Hello Swift』が出力されます。
ここまでは大丈夫でしょうか。
さて、これまで『変数』を生成してその後に値を代入をする、という流れでしたが『変数』を生成してそれと同時に何かを代入することもできます。以下のような感じですね。
var s: String = "Hello world" // 『変数』の生成と同時に文字列『Hello world』を代入します。 print(s) // 文字列『Hello world』が出力されます。
このように『変数』の生成と同時に何かの値を代入することを『初期化』と呼びます。そして代入された値は『初期値』と呼ばれます。
ちなみに以下は『初期化』じゃないです。ただの代入になります。
var s: String s = "Hello world" // これはただの代入です。 print(s) // 文字列『Hello world』が出力されます。
ちょっとややこしいのですが、『変数』の生成と同時に何かの値を代入することが『初期化』なので上記の場合はただの代入になっちゃいますね。
そして『初期化』を行った場合はデータ型の指定をしなくても変数が生成できます。
どういうことかというとこんなことです。
var s = "Hello world" // ここに注目して下さい。 print(s) // 文字列『Hello world』が出力されます。
これまで『変数名: データ型』って感じで型の指定をしていましたよね。『初期化』を行った場合は上記のように型の指定をしなくても『変数』が生成でき、『初期値』に対する適切なデータ型を自動で設定してくれます。
先程のサンプルだと文字列『Hello world』が『初期値』なのでその値に該当する適切なデータ型である『String型』が指定されているものとして生成されます。
var s = "Hello world" // 文字列『Hello world』の『String型』が指定されているものとして扱われます。 print(s) // 文字列『Hello world』が出力されます。
数値を『初期値』として『初期化』すると『Int型』の『変数』として生成されたりします。というわけで色々と試してみるとこんな感じです。
var s = "Hello world" // 文字列『Hello world』が『初期値』なので『String型』で生成されます。 var n = 1 // 数値『1』が『初期値』なので『Int型』で生成されます。 var n = 3.14 // 数値『3.14』が『初期値』なので『Double型』で生成されます。
Swiftで『変数』を生成するときは『初期化』を使って行う事の方が多いかもしれませんので上記の記法はバッチリマスターしておいて下さい。
これまで、文字列を『"』で直接書いたり、数値を直に書いたりといった記述をしてきました。
この「直に書く」っていう記述方法には名前がついており、『リテラル』とか『リテラル式』と呼んだりします。
文字列を記述する『リテラル』は『文字列リテラル』、整数を記述する『リテラル』は『整数リテラル』、といったように各リテラルに名前が付いていたりもしますね。
なので先輩から「ここに文字列リテラルで初音ミクを記述して!」って言われたら「"初音ミク"」って書くようにしましょう。
"初音ミク" // 文字列リテラルです。 1 // 整数リテラルです。 3.14 // 小数点リテラルです。 true // 真偽値リテラルです。
『リテラル』は「数値や文字列を直に記述した定数」って意味になるので、直接値を書いたら『リテラル』に該当する、というイメージでOKかと思います。
ただし、言語によって若干『リテラル』の意味が違う場合もありますのでそこはご注意下さい。
『変数』を宣言だけ行った場合、その値にアクセスしようとするとエラーができます。
var s: String // 宣言だけします。 print(s) // エラーです。
これを回避するには何かを代入してあげて下さい。
var s: String // 宣言だけします。 s = "" // 空の文字列を代入してあげます。 print(s) // OKです。
他の言語だと『null』とか『nil』とか『undefined』とか「何も定義してないっすよー」という値が返ってきてエラーにならなかったりすることが多いのですが、SwiftだとNGになりますのでご注意です。
なので以下のように適当な値で『初期化』をしておく、という手法も良く使われるので覚えておいて下さい。
var s: String = "" // こんな感じで初期化しちゃうという手法もよく使われます。 print(s) // OKです。
そしたらそのまま『定数』についてもやっていきましょう。『定数』は『変数』と使い方はほとんど変わらないのですがひとつだけ大きな違いがあり、一度代入した値を上書きことができないという感じになります。「変更ができない変数」というイメージですね。
『定数』は『var』ではなく『let』で宣言します。以下のような感じですね。文法は『変数』の時と同じような感じになります。
// 定数を定義します。 let n = 1 let _n: Int = 2 let s: String
では試しに色々とやってみましょう。
まず『初期化』した『定数』を上書きしてみます。するとこうなります。
let n = 1 n = 2 // エラーです。
上書きすると怒られますね。
じゃあ『初期化』しないで『変数』を生成してその後に代入してみます。するとこうです。
let n: Int n = 1 // OKです。
しかしその後に代入しようとすると、
let n: Int n = 1 // OKです。 n = 2 // エラーです。
エラーですね。
こんな感じで『定数』は一度値を代入した後の値の変更はできません。ここ間違いやすいので要注意です。
他の言語でも『定数』っていうのはあったりするのですが、Swiftほど厳しくないので結構なんでも『変数』で構築しちゃってるのが現状です。
しかし、Swiftでは「最初に代入された値を変更しない場合は必ず変数ではなく定数にするように!」というコンセプトがあったりなかったりしますので、『変数』と『定数』の使い分けについては意識せざるを得ないことが結構多いです。
まあ一度も値を変更していない『変数』はXcode君が「これ定数のほうがええでー」ってこっそり教えてくれるのでXcode君に従ってしまえばOkだったりします。
プレイグラウンドでは教えてくれなかったりしますが、アプリ開発とかをやるとすぐに体験できるかと思います。
※これについて詳しくは『Xcode入門編』とかでやっていく予定です。多分。
『変数名』や『定数名』などの名前の事を『識別子』(しきべつし)と呼んだりすることがあります。
会話などでは『変数名』とか『定数名』とかと呼ばれることがほとんどですが、ちょっと難しめの参考書などでは『識別子』と書いてあったりします。
ただし『識別子』は「集合の中から識別できる名前」という意味になるので変数名と定数名に限らず関数名や配列名なども全て『識別子』となり、変数名よりも広義なものを指す言葉です。こちらも覚えておきましょう。
『変数』を生成することを『変数宣言』といいます。『定数』を生成することは『定数宣言』といいます。
まとめて『宣言』なんて呼ばれることも多いですね。『変数宣言』って言葉はめっちゃ使いますが、『定数宣言』はあんまり使われない気がします。まあSwift以外の言語では『変数』と『定数』の取り扱いにそこまで厳しくないので当然と言えば当然かもしれません。
現場の先輩とかに「ここの宣言変じゃない?」といちゃもんをつけられたりご高説を頂戴することもあるかもしれないので覚えておきましょう。
Swiftで『識別子』として使用できる文字は英数字、アンダーバー、ダラー記号あたりです。
let n = 0 let _n = 1 let $ = 2
数値は『識別子』の最初の文字として使用することはできませんのでご注意です。2文字目以降であれば数字を使っちゃってKです。さらに半角スペースと全角の空白文字は『識別子』として使用できません。
let n1 = 0 // OKです。 let 1n = 1 // エラーです。 let = 2 // 全角スペースです。エラーです。
あと『_』を単独で使用すると『ワイルドカード』とか別の機能が発動してしまうため、いつもの『識別子』として使用できませんのでご注意下さい。それと同様に『$0』みたいな『$』と数字の組み合わせも別の用途に使用されてるのでダメです。
let _ = 0 // 定義できますが通常の定数ではないためご注意下さい。 print(_) // こんな感じで出力しようとするとエラーです。 let $0 = 1 // これもダメです。
そしてUnicode文字も使用できます。なので日本語も使えちゃうのは内緒です。
let 初音ミク = "ミクだよー" // こんなのもOKだったりします。 print(初音ミク) // 文字列『ミクだよー』が出力されます。
そんでもって、Swiftの『予約語』を『識別子』として使用することはできません。
『識別子』を『`』(バッククォート)で囲う事で『予約語』とかを無理矢理使うことができるみたいですが、そんな事をする理由もあんまりないのでやめたほうが無難でしょう。
Swiftでは大文字小文字が区別されます。
var n = 1 // 大文字小文字が区別されるので違う変数として定義できます。 var N = 2
これ、プログラム言語によって区別されたりされなかったりとめっちゃ差があるので気をつけてください。著者もよく間違えてます。
『予約語』とは将来そのプログラミング言語に実装する可能性がある機能名とかのことで、全ての『予約語』は前もって変数名などの識別子としての使用は不可にしておかないといけません。
どういうことかと言うと、例えば将来『hoge』っていう名前で何かの機能を搭載したいと考えているとしましょう。
そうするならば今現在も『hoge』という名前を使用禁止にしておかないと古いソースコードを最新の環境で実行したときに当時想定していた処理と違う処理が実行されてしまい、古いソースコード全般が使えなくなってしまいます。
これが『予約語』を識別子として使用できない理由です。
Swiftの『予約語』について調べたかったら公式サイトを見に行ったり、「Swift 予約語」って感じでgoogle先生に聞いてみて下さい。きっと幸せになれると思います。
Swiftでは『var』とか『let』を使って宣言するときに『,』で区切ることで複数同時に宣言することができます。
let n = 0, s = "初音ミク", d = 3.14 // 『,』で区切ることで複数同時に宣言できます。
この記法も良く使用されるので覚えておきましょう。
というわけでかなり長くなってしまったのでこの辺で一旦切ります。
まだ肝心な変数と定数の使い方についてやってなかったので次の記事でそれらについてやっていきたいと思います。
ではではこの辺で。またお会いしましょう。
この記事は桜舞が執筆致しました。
著者が愛する小型哺乳類 |
桜舞 春人 Sakurama HarutoISDN時代から様々なコンテンツを制作しているちょっと髪の毛が心配な東京在住のプログラマー。生粋のロングスリーパーで、10時間以上睡眠を取らないと基本的に体調が悪い。好きなだけ寝れる生活を送るのが夢。ゲームとスポーツと音楽が大好き。誰か髪の毛を分けて下さい。 |
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。