https://youtu.be/rDBUtFihQVI
今回は 定数と変数
の 命名
について眺めていきます。そんなセクションでありながら内容になぜか前にも話した変数や定数の書換可能性についてが登場するのが不思議に思いながらも、とりあえずは本書に沿っていくスタイルは崩さずそのままそれらも見ていくことにしますね。それを見終えて時間があれば、続いて 定数と変数の出力
についても見ていくことになりそうです。どうぞよろしくお願いします。
——————————————————————————— 熊谷さんのやさしい Swift 勉強会 #95
00:00 開始 00:11 今回の展望 02:15 変数名に絵文字が使える 04:37 Noah's Arc in Swift 05:32 Swift 1 の配列表記 06:50 絵文字な名前の変数名は実際に使う? 08:26 数学特有の表現 10:19 円周率 π を名前に使う? 11:35 入力が困難な変数名 14:05 絵文字の文字幅 15:06 絵文字の雰囲気 16:59 SF Symbols は変数として使えない 17:49 変数に使えない文字は多い印象 18:18 Unicode のさまざまなブロック 21:58 文字コード体系 26:21 数字から始まる変数名 27:33 先頭が数字だとダメな例は? 31:23 先頭に数字を許さないのはパースの都合? 38:09 既存の馴染みある表現を尊重する 40:47 クロージングと次回の展望 ———————————————————————————
Transcription & Summarize : 熊谷さんのやさしい Swift 勉強会 #95
はい、とりあえず始めていきましょう。今日は整数と変数の命名についてのセクションなんですよ。ただ、どんなことを話そうかなと思って、スライドをパラパラとめくってみたら、ネーミングに関連しそうなスライドがあったんですね。元の「Swift Programming Language」を確認してみたんですが、変数と定数の違いについての話がまた出てきて、同じ内容なんですけど、例題やサンプルコードが違っていました。なぜこんな風に重複しているのか疑問を持ちつつ、話しながら進めれば何か見えてくるかもしれませんね。
まず、使用できる文字についてお話します。ネーミングに関する話だと思っていたんですが、思ったより緩い感じの内容でした。変数名にはユニコード文字列を含むほとんどの文字を使用可能です。たとえば、「π」という文字や、「你好」といった文字、さらには絵文字も使えます。Swiftが登場した直後から、絵文字が使えることが大きなアピールポイントでした。ご存知の方も多いかと思いますが、変数名に実際に絵文字を使っていますか?
ちょまどさん: サンプルコードではどうですか?サンプルコードを分かりやすくするためだけの例なら使うかもしれませんが、プレイグラウンドレベルのサンプルでも絵文字は意味が通じやすくなるのでしょうか?
アレックス: ストリームの流れの中で絵文字を使う場合もありますね。
ちょまど: なるほど。変数名として使うのはどうでしょうか?
アレックス: 確かに、変数名として使うのは珍しいですね。
ちょまど: でも実際にはこうやって使えるわけです。テストとか入れる場合にも便利ですし、コメントでサンプルコードに絵文字を使うこともあります。ただ、実際のプロダクトで使うことは少ないかもしれませんね。
アレックス: Swiftが2019年のWWDCで公開された直後に、絵文字が使えることをアピールしたことで、とある人が上げたサンプルコードが話題になりました。それがすごく印象に残っています。
ちょまど: そういう入れ方もありますよね。これはまたSwiftの初期バージョンの文法です。この書き方も慣れ次第ですね。今のほうが統一感があって良いかもしれません。
アレックス: こういったコードも書けるのが面白いですが、実際に使うのは難しそうですね。誰か実際にこういうコードを使っている方がいるのか気になりますが、プロダクトではあまり使われないでしょうね。 言語仕様上決まっているのでOKですが、あまり使われていないのを見ますね。
ちょまど:絵文字のキーボードを開発している人は使っているかもしれませんね。
アレックス:そうですね。ただ、ラバータイヤを表す変数として使わなければいけない場合に限られるかもしれませんね。やっぱり、意味が伝わらないと良くないですから、なかなか限定的ですよね。
ちょまど:確かに、意味が伝わらないといけないというのがカギになりそうですね。逆に言うと、意味が伝わる場合には絵文字を使うのもあり得ますね。コメントで絵文字ではなくリンクをくれた方がいましたが、それは数学記号のことですかね?
アレックス:そうかもしれませんね。あ、これですね。馴染みすぎて見逃していましたが、確かに数学記号は自然に使われることがありますね。このコードを見る限り、Z
は整数を表していますよね。他にも実数(リアルナンバー)などの集合を表現するのに使われていますね。大学の数学科などではこういった記号がよく使われるのでしょう。
ちょまど:確かに、自然に見えますね。こういった特殊な文字の使い方は上手ですね。ただ、標準では絵文字が変数に使えると言っても、あまり使われていませんね。
アレックス:確かに。Swift 1が登場したときに絵文字が使えるという話がありましたが、疑問に思ったのは、なぜ演習率を表すのに Pi
を使うのかということです。絵文字やユニコードを使えるなら、直接絵文字を使うこともできます。しかし、入力デバイスが特殊すぎて使いにくいという問題もあります。
ちょまど:そうですね。例えばMacではオプション + P
で演習率を入力できますが、他のデバイスでは難しいです。入力方法が分からないものを使うべきではありません。
アレックス:同じことが数学記号にも言えます。リアルナンバーを表す記号を出そうとするときに、日本語入力では認識されない場合があります。これが問題ですね。なので、タイプエイリアスを使うと意味がなくなることもあるでしょう。
ちょまど:そうですね。実際に使う場合、意味的に正しいかといった問題だけでなく、入力デバイスの問題もあります。 とりあえず、今の時代には即さないかなっていう感じがしてきますね。これが時代が早すぎるのか、それともそもそもどうでもいいのか、その辺りも違ってきそうですが。
絵文字だと幅の問題もありますね。2文字分の幅を使っちゃうから、インデント的にはちょっと不便です。確かにインデントでは絵文字とか漢字もそうですが、そういう問題がありますね。幅がちょっと違いますからね。フォントにも寄るんでしょうけど、確かに違いますね。
プロポーショナルフォントだと、愛と絵文字がプロポーショナルとは限らないので、絵文字がとにかく大きいんです。2文字分の幅を占めますね。なるほど、絵文字によって違うとかではなく、2文字分なのですね。こういったところはコードを書くとなるとなかなか支障が出てくる場合があると思います。
あと、記事によって絵文字の雰囲気が違ったりすることもありますからね。一応、絵文字としての規定はあるみたいなので、大きく外れることはないでしょうが、電話のアイコンを使うときに、例えばMacで表示するとiPhoneのアイコンになっちゃいます。でも他のOSだと電話のアイコンは違いますよね、きっと。
var phoneIcon = "📞"
みたいに変数を作ったら、他の端末では期待通りの絵文字で表示されないこともあります。例えば、Androidの絵文字になってしまうとか、そういったところを踏まえると難しいですね。無理やり話しましたが、絵が変わってしまったときにどうなるかっていう課題もあります。
また、コメントで「SFシンボルは変数として使えない」とありますね。なるほど、iOS開発している人にとっては馴染みのあるものと思いますが、実際には使えないということです。このMacにはそれが入ってないので試せないのですが、色んな文字をフォントで表現するアプリがあり、それが文字としてコピーできるやつです。
これが使えないみたいですね、変数名として。先ほどのスライドにもほとんど使えると書いてありましたが、意外と使えないんです。こういった使いにくさがあるのが現実ですね。
さて、先にこの話しておきますかね。2行目、使用できる文字としてほとんどどんな文字も使えるとはなっていますが、空白文字は使えないし数学的シンボルも使えない。これは何を言ってるんだろう、ユニコードのことですね。
ユニコードには色々なセクションがあって、それぞれの文字が区画で決まっているようです。その中で、使えない文字が色々あります。例えば、Mathematical Operators Block
や Mathematical Alphanumeric Symbols Block
といったセクションがあり、そういった所の文字は使えないとなっています。
でも最近、π
みたいな記号は使えるんですよね。解釈が難しくて、なかなか過ぎますね。
コメントで「使用領域」で使えるものについても触れていますね。SF Symbolとか数学的シンボルについて話しています。
let π = 3.14159
このように数学的シンボルも使えるものと使えないものがあるんです。どうやらユニコードのセクションに依存しているようですね。大文字の Π
は使えていないこともある。ちょっと自分の解釈が間違っているのかもしれませんが、このような制限があると感じますね。 とりあえず、こういったユニコードの規格があります。私も詳しくはないので、保留しておきますが、ユニコードには策定された使用領域があり、規格もあります。ユニコードについて調べると、多くの情報が出てきますが、その中でサロゲートペアといった概念もあり、これもユニコードの一部です。理解しようと試みても難しい部分が多いですが、歴史的に使用されてきた文字コード体系がいかに複雑であるかを感じます。
例えば、ASCII
はシンプルですが、日本語を表現するためのEUC-JP
(Extended Unix Code for Japanese)などのコード体系も存在します。これらの文字コードの違いを理解することは、特に昔のプログラマーにとっては大変な作業だったと思います。ローカルな文字コード体系が乱立していた時代には、他国の言語を扱うのは難しかったでしょう。
日本語のコード体系としては、Shift_JIS
やEUC-JP
が主流で、これらは自身の記憶としても特に苦労した部分です。Shift_JIS
の場合、エスケープシーケンスとして使う文字がデータ中に含まれないように設計されているため、正規表現などの処理で使いやすいといった特性があります。こうした経験を通じて、文字列の扱いにも習熟することができました。
ユニコードの採用により、各国の文字コード体系の統一が図られ、随分と楽にはなりましたが、依然として複雑な部分は残っています。ユニコードには数学的シンボルや矢印、特殊な領域用の文字など、多種多様な文字が含まれています。これにより、古い8ビットの文字コード体系の時代から進化してきました。コンソールでラインや枠を描くための文字などもあり、それらはASCIIコード内に収録されていたりします。
Swift言語において、変数名として数字から始まる名前を使えないという制約があります。例えば、123abc
という変数名は不適切ですが、abc123
は問題ありません。このルールは、変数名として先頭に数字を使うとパーサーがリテラルと誤解する可能性が高く、文法解析が複雑になるためです。
皆さんも、プログラミングの歴史や文字コードの進化について、興味を持って調べてみてください。それでは、この続きに進みましょう。 関数名にも数字が使えるようになると紛らわしくなる可能性があります。たとえば変数の名前に数字を使用できると、enum
のケースや関数でも同じ名前を使えるという問題があります。具体的には、enum
のケースで「ケース1」とかができてしまったりすると、数字が特定の意味を持ってしまい、それがストリングで表現されるケースと重なってしまい紛らわしくなります。
また、「1ドット何とか」といった形式での表現も可能になり、それがストリングのメソッド呼び出しのように見えてしまいます。これは非常に分かりづらい状況を引き起こします。特に、数字だけを使った変数名は推論が難しく、それによって意図しない動作が発生する可能性があります。実際、変数名が数字の場合、その変数に対する操作(たとえば「2に1を足す」といった操作)が予期せぬ結果を生むかもしれません。
このように、数字だけを使った変数名が許されてしまうと、非常に混乱を招くことが理解できました。Swiftでは、変数名が数字で始まることはできないとされており、それ以外の文字が含まれていれば使用可能というルールがあります。この制約も、言語仕様として非常に理にかなっていると感じます。
この制約がある理由の一つに、コンパイル時のパースの問題が挙げられます。変数名をリテラルと誤解されるリスクが伴い、それがパースの都合に悪影響をもたらす可能性があります。リテラルと名前の優先度の問題も関係するため、変数名が数字で始まると、リテラルとして解釈されやすくなり、その結果、より複雑な問題となることが考えられます。
他の言語でも、数字で始まる変数名を許さない場合が多いです。例えば、C言語やObjective-Cでも同様の制約が存在します。特別なリテラル(0B、0Xなど)を使用することで衝突を避けています。こういった背景からも、Swiftのルールが妥当であることが理解できます。
最後に、コメントでいただいた情報として「0B」や「0X」といった特定のリテラルの扱い方も示されました。これらのリテラルが許される一方で変数名を数字で始めることを避ける、というバランスを取っている点は、既存の文化や慣習を大事にする姿勢の表れと言えるでしょう。特に16進数の場合はその必要性が際立ちますね。
このように、数字を変数名の先頭に使用できないという制約は、プログラムの明確さと可読性を保つために重要な役割を果たしていることが分かります。 この 0x
みたいな表現、昔から使われているのでね。そうすると、数字から始まるものを許すよといったときに、この変数に代入しているうちはいいんですけど、さっきのお話が役に立ってきますね。数字の1に10を代入したときと同じような発想ですよね。これ、ちょうどこんな風に入れるとヤバいことが起こってくるよっていうお話ね。
こうやって書いたときに、確かにヤバいですね。これね。これを避けるためには、0から始まる変数はダメだよとか、そういった奇妙なルールを作っていくんだったら、最初から頭数字から始まるものは除外すると言った方が、コンパイラーやパーサーの方がシンプルになってくる気がしますね。
数1でキャラクターが isNumeric
だった場合にはリテラルのパースを始めて、そうではなくそれ以外だったらシンボルのパースを始める、みたいな。こういう風な入り口を分けるっていうことができるのかな。逆に、数字での変数名も許可してたとすると、最初とにかくシンボルのパースを始めて、もし途中で最終的に全部が数字だった場合にはリテラルとして扱う、みたいなね。そういったコードに多分変わってくるんじゃないかな。
そうすると、とりあえずシンボルと決め込んで見ていくけど、これやっぱり全部見たけどシンボルじゃなかった、みたいな感じで手戻りが発生するというのかな。手戻りになるかどうかはこの先のコード次第な気もしますけど。とりあえず、といった感じで色々複雑なところは確かにありそうですね。
弊害として見い出せるところ、うかがえるところとしては、ちょっとはっきりとズバリこれだね、みたいな理由は自分の中ではまだ見つかっていない感覚は残っていますけど、とりあえず数字で始めることはできないけど、それ以外でなら使えるっていうのは、パーサーの問題なのかなというところに、とりあえず手を置くといいのかな。そこまで考えなくていいか、とりあえず画面通り捉えればOKなのかな。
で、あとさっきの監修のお話ししましたけれど、このリテラル表現を変えてしまえば変数名を数字から始めることもできそうだなって話しましたけど、Twistって繰り返しになっちゃうな。APIデザインガイドラインの中で、慣用的な表現があった場合にはそれに従うという、そういった話があったのを覚えている方は覚えていると思うんですけど、そこで例に挙がってたのがサイン関数ね。正確な文字表現だと sin
になるらしいんですけど、コンピューティングの歴史上、サイン関数って言ったら sin
って書くのが一般的に通りがいいから、Twistも sin
を採用してるよっていう、そういったガイドラインがあるわけですけど、この16進数表記もそうですよね。きっとね。
16進数表記といえば 0x
が定着しているので、Twistも 0x
で通したいっていう意図がありそうな気がします。この変数名が0っていう話、0じゃないわ、数字から始められないっていうお話ですね。で、最初の円周率 π
の話にも戻したいんですけど、絵文字が使えるとなると9行目の表現が、いや絵文字じゃなくてユニコード文字が使えるとなると9行目が適切って捉える考え方もありますけど、昔から円周率は π
と表現してきてた、Twist以前からのコンピューティングの文化があるので、Twistも円周率は π
として使っていくよ、みたいなところもあるかもしれない。昔は1行目から6行目みたいな、そこまで言わなくていいや、9行目みたいな実装を標準ライブラリに入れたらよかったんじゃないかと、昔は思ってたんですけど、今は落ち着いた、8行目でいいなっていう感じがAPIデザインガイドラインを何回も読んで、そういうふうに思うようになった。
いい具合の時間になったので、今日は使用できる文字について具体的に眺めていく回で終わりにしようかなと思います。次回以降は、また冒頭で挙げたお話や、変数定義におけるルール、いくつかありますのでその辺を話していこうと思います。
これで終わりにします。お疲れ様でした。ありがとうございました。