今回も引き続き Swift.org の About Swift
を眺めていきます。Objective-C からみた追加機能、そんな話題の中から 強力なエラー処理機構
から見ていく感じになりそうです。よろしくお願いいたしますね。
—————————————————————— 熊谷さんのやさしい Swift 勉強会 #6
00:00 開始 01:16 Objective-C 04:14 Pascal 05:23 パスカルケース 07:21 強力なエラー処理機構 07:49 do-try-catch 10:28 エラーハンドリング 13:59 エラー対応 19:35 エラーが発生する箇所の明記 22:35 列挙型以外でのエラー表現 25:35 状況に応じたエラー対応 27:16 関数でのエラー対応 29:50 エラーの再送出 32:50 rethrows 38:40 do ブロックの省略 39:46 エラーハンドリングの感動ポイント 44:04 C++ 46:14 高度な制御構文 46:43 do によるローカルスコープ 50:31 do によるエラー対応 54:19 次回の展望 ——————————————————————
Transcription & Summarize : 熊谷さんのやさしい Swift 勉強会 #6
今回は前回からの続きです。Swiftについて学んでいるシリーズの中で、現在は「追加機能」というところまで来ています。前回も言いましたが、この「追加機能」という表現に違和感を覚える方もいるかもしれません。新しい言語であるはずのSwiftに「追加機能」とは何なのか、ということですね。
これは、SwiftがObjective-Cの後継として登場したという背景から来ています。Objective-Cと違って、新しく強化された部分が記載されているのが「追加機能」として紹介されているのです。つまり、これを読むことでSwiftにはどんな新しい機能が追加されたのか、Swiftらしさがどこにあるのかが掴みやすくなります。個人的には、これは非常に良い題材だと思って話しています。
おだしょーさんが、「Objective-Cの開発にはAppleが関わっていた」という話をしていました。確かに、新機能と聞くとAppleが作っていたような印象がありますね。Objective-CにもAppleが関わっていたと記憶していますが、どうでしたっけ?
おだしょーさん曰く、積極的かつ愛情を込めて関わっていた感じがあるようですね。Steve Jobsが特に力を入れていたという話も聞いたことがあります。また、Objective-C 2.0ぐらいからエラーメッセージや警告メッセージが非常に丁寧になり、Xcodeとの親和性が高まったように感じます。Xcode 4の頃くらいからでしょうか。
その頃からSwiftの雰囲気が漂い始め、最終的にはSwiftが完成形として登場したような印象です。特にiOSやmacOSといったAppleのプラットフォームに非常に親和性の高いものに変わっていくような印象があります。ですから、AppleがObjective-Cに関わっていたことは間違いないでしょうし、それがSwiftの開発にも繋がったという感じですね。
そのあたりの話も調べてみると面白いかもしれません。確かにAppleはObjective-Cを非常に愛していたようですね。同時に、macOSアプリも以前はJavaやPascalが使われていた時代がありましたが、最終的にはObjective-C一本に統一され、そこからSwiftへと変わっていきました。
Pascalの文字列や文化も昔のmacOSにはありました。具体的にPascalが使われていたかどうかは経験がないのでわかりませんが、その時代を知っている人もいるでしょう。OS 8の頃の話ですね。
じゃじけさんからも何か知識が出てくるかもしれませんが、PascalはPascalCaseの名称の由来にもなっています。Pascal言語自体がアッパーキャメルケースを導入していたためです。Pascalで書かれたコードも少し残っているようですが、基本的にはC言語が中心だったようです。Pascalの文字列は先頭にバイト数が入るという構造があり、そういった文化が使われていました。
文字列の扱いには色々と苦労があったようで、パスカル文字列は先頭を見ることで文字列の長さが分かるため、当時はこういった形式が使われていたとのことです。これにより、文字列の終端を見誤ると大変な問題が発生してしまうこともありました。懐かしい話ですが、文字列の扱いは非常に興味深いトピックです。
さて、本題に戻りましょう。前回は「関数型プログラミングパターン」の話を終えたところまで進めました。次に、「強力なエラー処理構文が内蔵された」という話に入っていきます。これは以前の勉強会で話題にしたトライキャッチの話にも関連します。何度も復習することで身につきやすくなるので、ゆっくりと見ていきましょう。
エラー処理機構ですが、具体的にはどのようなものがあるか見ていきましょう。日本語訳は正確でないこともありますが、「強力なエラー処理」という表現で良いでしょうか。 とりあえず、エラー処理機構というのがありまして、Objective-Cの頃にも@try
、@catch
みたいな例外処理がありました。Objective-Cでは使う機会はあまり多くなかったですけど、というか好みが分かれていたのかなと感じます。私自身はよく使っていましたが、これがありました。
C++も例外処理がありますし、Javaも例外処理が主流です。基本的に例外処理は現代のプログラムにおいて主流で、実行順序が左から右、上から下という基本を無視して、いきなり異常が発生した部分に飛んでいくといったイメージがあります。
その例外処理の最もクリティカルなところは、ランタイムエラーです。ランタイムエラーで何か不正アクセス等が起きると、そのタイミングでアプリが強制終了されます。そのタイミングをキャッチして復帰を目指したり、安全に処理をして終了させるのが例外処理の特徴でしょう。
Swiftではこれを「エラーハンドリング」と呼び、例外(エクセプション)とは違う名前を付けています。このあたりが他の言語と異なる点で、興味深いところです。
エラーハンドリングの基本的な道具としては、まずエラーを自分で定義することです。オブジェクト指向言語の場合、特別な例外処理用のクラスを継承して、独自のクラスを作成することが一般的です。C++でも同様です。しかし、Swiftではクラスにこだわらず、「型」であればエラーとして表現することができます。よく使われるのは列挙型です。
例えば次のようにしてディスクエラーのエラー型を作成することができます。